• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10/tidy-15.15/tidy/src/

Lines Matching refs:node

26 Bool TY_(CheckNodeIntegrity)(Node *node)
31 if (node->prev)
33 if (node->prev->next != node)
37 if (node->next)
39 if (node->next->prev != node)
43 if (node->parent)
45 if (node->prev == NULL && node->parent->content != node)
48 if (node->next == NULL && node->parent->last != node)
52 for (child = node->content; child; child = child->next)
53 if ( child->parent != node || !TY_(CheckNodeIntegrity)(child) )
66 Bool TY_(IsNewNode)(Node *node)
68 if (node && node->tag)
70 return (node->tag->model & CM_NEW);
75 void TY_(CoerceNode)(TidyDocImpl* doc, Node *node, TidyTagId tid, Bool obsolete, Bool unexpected)
81 TY_(ReportWarning)(doc, node, tmp, OBSOLETE_ELEMENT);
83 TY_(ReportError)(doc, node, tmp, REPLACING_UNEX_ELEMENT);
85 TY_(ReportNotice)(doc, node, tmp, REPLACING_ELEMENT);
90 node->was = node->tag;
91 node->tag = tag;
92 node->type = StartTag;
93 node->implicit = yes;
94 MemFree(node->element);
95 node->element = TY_(tmbstrdup)(tag->name);
98 /* extract a node and its children from a markup tree */
99 Node *TY_(RemoveNode)(Node *node)
101 if (node->prev)
102 node->prev->next = node->next;
104 if (node->next)
105 node->next->prev = node->prev;
107 if (node->parent)
109 if (node->parent->content == node)
110 node->parent->content = node->next;
112 if (node->parent->last == node)
113 node->parent->last = node->prev;
116 node->parent = node->prev = node->next = NULL;
117 return node;
120 /* remove node from markup tree and discard it */
136 insert "node" into markup tree as the firt element
139 void TY_(InsertNodeAtStart)(Node *element, Node *node)
141 node->parent = element;
144 element->last = node;
146 element->content->prev = node;
148 node->next = element->content;
149 node->prev = NULL;
150 element->content = node;
154 insert "node" into markup tree as the last element
157 void TY_(InsertNodeAtEnd)(Node *element, Node *node)
159 node->parent = element;
160 node->prev = element->last;
163 element->last->next = node;
165 element->content = node;
167 element->last = node;
171 insert "node" into markup tree in place of "element"
172 which is moved to become the child of the node
174 static void InsertNodeAsParent(Node *element, Node *node)
176 node->content = element;
177 node->last = element;
178 node->parent = element->parent;
179 element->parent = node;
181 if (node->parent->content == element)
182 node->parent->content = node;
184 if (node->parent->last == element)
185 node->parent->last = node;
187 node->prev = element->prev;
190 if (node->prev)
191 node->prev->next = node;
193 node->next = element->next;
196 if (node->next)
197 node->next->prev = node;
200 /* insert "node" into markup tree before "element" */
201 void TY_(InsertNodeBeforeElement)(Node *element, Node *node)
206 node->parent = parent;
207 node->next = element;
208 node->prev = element->prev;
209 element->prev = node;
211 if (node->prev)
212 node->prev->next = node;
215 parent->content = node;
218 /* insert "node" into markup tree after "element" */
219 void TY_(InsertNodeAfterElement)(Node *element, Node *node)
224 node->parent = parent;
228 parent->last = node;
231 node->next = element->next;
232 /* AQ - 13 Jan 2000 fix for node->next == NULL */
233 if (node->next != NULL)
234 node->next->prev = node;
237 element->next = node;
238 node->prev = element;
321 Node* TY_(DropEmptyElements)(TidyDocImpl* doc, Node* node)
325 while (node)
327 next = node->next;
329 if (node->content)
330 TY_(DropEmptyElements)(doc, node->content);
332 if (!TY_(nodeIsElement)(node) &&
333 !(TY_(nodeIsText)(node) && !(node->start < node->end)))
335 node = next;
339 next = TY_(TrimEmptyElement)(doc, node);
340 node = next;
343 return node;
362 If last child of element is a text node
409 Node *node = NewNode(lexer);
411 node->start = lexer->lexsize;
435 node->end = lexer->lexsize;
437 return node;
442 Bool TY_(IsBlank)(Lexer *lexer, Node *node)
444 Bool isBlank = TY_(nodeIsText)(node);
446 isBlank = ( node->end == node->start || /* Zero length */
447 ( node->end == node->start+1 /* or one blank. */
448 && lexer->lexbuf[node->start] == ' ' ) );
465 Node *prev, *node;
483 else /* create new node */
485 node = TY_(NewNode)(lexer);
486 node->start = (element->start)++;
487 node->end = element->start;
488 lexer->lexbuf[node->start] = ' ';
489 TY_(InsertNodeBeforeElement)(element ,node);
493 /* discard the space in current node */
498 static Bool IsPreDescendant(Node* node)
500 Node *parent = node->parent;
513 static Bool CleanTrailingWhitespace(TidyDocImpl* doc, Node* node)
517 if (!TY_(nodeIsText)(node))
520 if (node->parent->type == DocTypeTag)
523 if (IsPreDescendant(node))
526 if (node->parent->tag && node->parent->tag->parser == TY_(ParseScript))
529 next = node->next;
532 if (!next && !TY_(nodeHasCM)(node->parent, CM_INLINE))
536 if (!next && node->parent->next && !TY_(nodeHasCM)(node->parent->next, CM_INLINE))
564 static Bool CleanLeadingWhitespace(TidyDocImpl* ARG_UNUSED(doc), Node* node)
566 if (!TY_(nodeIsText)(node))
569 if (node->parent->type == DocTypeTag)
572 if (IsPreDescendant(node))
575 if (node->parent->tag && node->parent->tag->parser == TY_(ParseScript))
579 if (nodeIsBR(node->prev))
583 if (node->prev == NULL && !TY_(nodeHasCM)(node->parent, CM_INLINE))
587 if (node->prev && !TY_(nodeHasCM)(node->prev, CM_INLINE) &&
588 TY_(nodeIsElement)(node->prev))
592 if (!node->prev && !node->parent->prev && !TY_(nodeHasCM)(node->parent->parent, CM_INLINE))
598 static void CleanSpaces(TidyDocImpl* doc, Node* node)
602 while (node)
604 next = node->next;
606 if (TY_(nodeIsText)(node) && CleanLeadingWhitespace(doc, node))
607 while (node->start < node->end && TY_(IsWhite)(doc->lexer->lexbuf[node->start]))
608 ++(node->start);
610 if (TY_(nodeIsText)(node) && CleanTrailingWhitespace(doc, node))
611 while (node->end > node->start && TY_(IsWhite)(doc->lexer->lexbuf[node->end - 1]))
612 --(node->end);
614 if (TY_(nodeIsText)(node) && !(node->start < node->end))
616 TY_(RemoveNode)(node);
617 TY_(FreeNode)(doc, node);
618 node = next;
623 if (node->content)
624 CleanSpaces(doc, node->content);
626 node = next;
671 static Bool InsertMisc(Node *element, Node *node)
673 if (node->type == CommentTag ||
674 node->type == ProcInsTag ||
675 node->type == CDATATag ||
676 node->type == SectionTag ||
677 node->type == AspTag ||
678 node->type == JsteTag ||
679 node->type == PhpTag )
681 TY_(InsertNodeAtEnd)(element, node);
685 if ( node->type == XmlDecl )
698 TY_(InsertNodeAtStart)( root, node );
702 TY_(InsertNodeAtStart)( root, node );
712 if ( node->tag &&
713 TY_(nodeIsElement)(node) &&
714 TY_(nodeCMIsEmpty)(node) && TagId(node) == TidyTag_UNKNOWN &&
715 (node->tag->versions & VERS_PROPRIETARY) != 0 )
717 TY_(InsertNodeAtEnd)(element, node);
725 static void ParseTag( TidyDocImpl* doc, Node *node, GetTokenMode mode )
732 if (node->tag->model & CM_EMPTY)
735 if (node->tag->parser == NULL)
738 else if (!(node->tag->model & CM_INLINE))
741 if (node->tag->parser == NULL)
744 if (node->type == StartEndTag)
747 (*node->tag->parser)( doc, node, mode );
772 move node to the head, where element is used as starting
775 static void MoveToHead( TidyDocImpl* doc, Node *element, Node *node )
779 TY_(RemoveNode)( node ); /* make sure that node is isolated */
781 if ( TY_(nodeIsElement)(node) )
783 TY_(ReportError)(doc, element, node, TAG_NOT_ALLOWED_IN );
788 TY_(InsertNodeAtEnd)(head, node);
790 if ( node->tag->parser )
791 ParseTag( doc, node, IgnoreWhitespace );
795 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
796 TY_(FreeNode)( doc, node );
800 /* moves given node to end of body element */
801 static void MoveNodeToBody( TidyDocImpl* doc, Node* node )
806 TY_(RemoveNode)( node );
807 TY_(InsertNodeAtEnd)( body, node );
811 static void AddClassNoIndent( TidyDocImpl* doc, Node *node )
819 TY_(AddStyleAsClass)( doc, node, sprop );
821 TY_(AddStyleProperty)( doc, node, sprop );
825 element is node created by the lexer
832 Node *node;
862 while ((node = TY_(GetToken)(doc, mode /*MixedContent*/)) != NULL)
865 if (node->type == EndTag && node->tag &&
866 (node->tag == element->tag || element->was == node->tag))
868 TY_(FreeNode)( doc, node );
883 if ( nodeIsBODY( node ) && DescendantOf( element, TidyTag_HEAD ))
892 if ( nodeIsHTML(node) || nodeIsHEAD(node) || nodeIsBODY(node) )
894 if ( TY_(nodeIsElement)(node) )
895 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
896 TY_(FreeNode)( doc, node );
901 if (node->type == EndTag)
903 if (node->tag == NULL)
905 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
906 TY_(FreeNode)( doc, node );
909 else if ( nodeIsBR(node) )
910 node->type = StartTag;
911 else if ( nodeIsP(node) )
919 node->type = StartEndTag;
920 node->implicit = yes;
922 TY_(CoerceNode)(doc, node, TidyTag_BR, no, no);
923 TY_(FreeAttrs)( doc, node ); /* discard align attribute etc. */
924 TY_(InsertNodeAtEnd)( element, node );
925 node = InferredTag(doc, TidyTag_BR);
928 else if (DescendantOf( element, node->tag->id ))
942 if (node->tag == parent->tag)
945 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE );
967 && node->tag->model
968 && (node->tag->model & CM_TABLE) )
978 if (TY_(nodeIsText)(node))
985 if ( TY_(InlineDup)(doc, node) > 0 )
990 TY_(InsertNodeAtEnd)(element, node);
1010 if ( InsertMisc(element, node) )
1014 if ( nodeIsPARAM(node) )
1016 if ( TY_(nodeHasCM)(element, CM_PARAM) && TY_(nodeIsElement)(node) )
1018 TY_(InsertNodeAtEnd)(element, node);
1023 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1024 TY_(FreeNode)( doc, node );
1029 if ( nodeIsAREA(node) )
1031 if ( nodeIsMAP(element) && TY_(nodeIsElement)(node) )
1033 TY_(InsertNodeAtEnd)(element, node);
1038 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1039 TY_(FreeNode)( doc, node );
1044 if ( node->tag == NULL )
1046 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1047 TY_(FreeNode)( doc, node );
1062 if ( !TY_(nodeHasCM)(node, CM_INLINE) )
1064 if ( !TY_(nodeIsElement)(node) )
1066 if ( nodeIsFORM(node) )
1069 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1070 TY_(FreeNode)( doc, node );
1092 if ( nodeIsFRAME(node) ||
1093 nodeIsFRAMESET(node) ||
1094 nodeIsOPTGROUP(node) ||
1095 nodeIsOPTION(node) )
1097 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1098 TY_(FreeNode)( doc, node ); /* DSR - 27Apr02 avoid memory leak */
1107 if ( TY_(nodeHasCM)(node, CM_HEAD) )
1109 MoveToHead( doc, element, node );
1113 if ( TY_(nodeHasCM)(node, CM_LIST) )
1116 node = TY_(InferredTag)(doc, TidyTag_UL);
1117 AddClassNoIndent(doc, node);
1120 else if ( TY_(nodeHasCM)(node, CM_DEFLIST) )
1123 node = TY_(InferredTag)(doc, TidyTag_DL);
1128 if ( !TY_(nodeHasCM)(node, CM_BLOCK) )
1135 else if ( TY_(nodeHasCM)(node, CM_BLOCK) )
1140 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE );
1153 if (node->tag->model & CM_HEAD)
1155 MoveToHead( doc, element, node );
1168 if ( nodeIsTD(node) )
1170 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1171 TY_(FreeNode)( doc, node );
1175 if ( nodeIsTH(node) )
1177 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1178 TY_(FreeNode)( doc, node );
1179 node = element->parent;
1180 MemFree(node->element);
1181 node->element = TY_(tmbstrdup)("th");
1182 node->tag = TY_(LookupTagDef)( TidyTag_TH );
1188 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE );
1192 if ( TY_(nodeHasCM)(node, CM_LIST) )
1201 node = TY_(InferredTag)(doc, TidyTag_UL);
1202 AddClassNoIndent(doc, node);
1204 else if ( TY_(nodeHasCM)(node, CM_DEFLIST) )
1212 node = TY_(InferredTag)(doc, TidyTag_DL);
1214 else if ( TY_(nodeHasCM)(node, CM_TABLE) || TY_(nodeHasCM)(node, CM_ROW) )
1221 node = TY_(InferredTag)(doc, TidyTag_TABLE);
1242 if (TY_(nodeIsElement)(node))
1244 if (node->tag->model & CM_INLINE)
1246 if (checkstack && !node->implicit)
1252 if ( TY_(InlineDup)(doc, node) > 0 )
1266 if ( nodeIsBR(node) )
1269 TY_(InsertNodeAtEnd)(element, node);
1271 if (node->implicit)
1272 TY_(ReportError)(doc, element, node, INSERTING_TAG );
1274 ParseTag( doc, node, IgnoreWhitespace /*MixedContent*/ );
1279 if (node->type == EndTag)
1280 TY_(PopInline)( doc, node ); /* if inline end tag */
1282 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1283 TY_(FreeNode)( doc, node );
1288 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_FOR);
1304 Node *node, *parent;
1340 while ((node = TY_(GetToken)(doc, mode)) != NULL)
1343 if (node->tag == element->tag && node->type == EndTag)
1346 TY_(PopInline)( doc, node );
1348 TY_(FreeNode)( doc, node );
1390 if ( node->type == StartTag
1391 && node->tag == element->tag
1392 && TY_(IsPushed)( doc, node )
1393 && !node->implicit
1395 && node->tag && (node->tag->model & CM_INLINE)
1396 && !nodeIsA(node)
1397 && !nodeIsFONT(node)
1398 && !nodeIsBIG(node)
1399 && !nodeIsSMALL(node)
1400 && !nodeIsSUB(node)
1401 && !nodeIsSUP(node)
1402 && !nodeIsQ(node)
1403 && !nodeIsSPAN(node)
1406 if (element->content != NULL && node->attributes == NULL)
1408 TY_(ReportWarning)(doc, element, node, COERCE_TO_ENDTAG_WARN);
1409 node->type = EndTag;
1414 if (node->attributes == NULL || element->attributes == NULL)
1415 TY_(ReportWarning)(doc, element, node, NESTED_EMPHASIS);
1417 else if ( TY_(IsPushed)(doc, node) && node->type == StartTag &&
1418 nodeIsQ(node) )
1420 TY_(ReportWarning)(doc, element, node, NESTED_QUOTATION);
1423 if ( TY_(nodeIsText)(node) )
1429 if ( node->start >= node->end )
1431 TY_(FreeNode)( doc, node );
1435 TY_(InsertNodeAtEnd)(element, node);
1440 if (InsertMisc(element, node))
1444 if ( nodeIsHTML(node) )
1446 if ( TY_(nodeIsElement)(node) )
1448 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED );
1449 TY_(FreeNode)( doc, node );
1463 if ( nodeIsP(node) &&
1464 node->type == StartTag &&
1471 node->tag = TY_(LookupTagDef)( TidyTag_BR );
1472 MemFree(node->element);
1473 node->element = TY_(tmbstrdup)("br");
1475 TY_(InsertNodeAtEnd)(element, node);
1480 if ( nodeIsP(node) &&
1481 node->type == StartTag &&
1485 TY_(InsertNodeAtEnd)(element, node);
1486 (*node->tag->parser)( doc, node, mode );
1491 if ( node->tag == NULL || nodeIsPARAM(node) )
1493 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1494 TY_(FreeNode)( doc, node );
1498 if ( nodeIsBR(node) && node->type == EndTag )
1499 node->type = StartTag;
1501 if ( node->type == EndTag )
1504 if ( nodeIsBR(node) )
1505 node->type = StartTag;
1506 else if ( nodeIsP(node) )
1511 TY_(CoerceNode)(doc, node, TidyTag_BR, no, no);
1513 TY_(InsertNodeAtEnd)( element, node );
1514 node = TY_(InferredTag)(doc, TidyTag_BR);
1515 TY_(InsertNodeAtEnd)( element, node ); /* todo: check this */
1519 else if ( TY_(nodeHasCM)(node, CM_INLINE)
1520 && !nodeIsA(node)
1521 && !TY_(nodeHasCM)(node, CM_OBJECT)
1529 if ( nodeIsA(node) && node->tag != element->tag )
1531 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE );
1536 TY_(ReportError)(doc, element, node, NON_MATCHING_ENDTAG);
1537 TY_(FreeNode)( doc, node);
1547 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1548 TY_(FreeNode)( doc, node);
1552 && node->tag->model
1553 && (node->tag->model & CM_TABLE) )
1562 if ( TY_(nodeHasCM)(node, CM_HEADING) && TY_(nodeHasCM)(element, CM_HEADING) )
1565 if ( node->tag == element->tag )
1567 TY_(ReportError)(doc, element, node, NON_MATCHING_ENDTAG );
1568 TY_(FreeNode)( doc, node);
1572 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE );
1587 /* if (node->tag == doc->tags.tag_a && !node->implicit && TY_(IsPushed)(doc, node)) */
1588 if ( nodeIsA(node) && !node->implicit &&
1594 /* if (node->attributes == NULL) */
1595 if (node->type != EndTag && node->attributes == NULL)
1597 node->type = EndTag;
1598 TY_(ReportError)(doc, element, node, COERCE_TO_ENDTAG);
1599 /* TY_(PopInline)( doc, node ); */
1605 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE);
1616 if ( nodeIsCENTER(node) || nodeIsDIV(node) )
1618 if (!TY_(nodeIsElement)(node))
1620 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1621 TY_(FreeNode)( doc, node);
1625 TY_(ReportError)(doc, element, node, TAG_NOT_ALLOWED_IN);
1630 InsertNodeAsParent(element, node);
1635 TY_(InsertNodeAfterElement)(element, node);
1641 TY_(InsertNodeAtEnd)(node, element);
1645 if ( nodeIsHR(node) )
1647 if ( !TY_(nodeIsElement)(node) )
1649 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1650 TY_(FreeNode)( doc, node);
1654 TY_(ReportError)(doc, element, node, TAG_NOT_ALLOWED_IN);
1659 TY_(InsertNodeBeforeElement)(element, node);
1664 TY_(InsertNodeAfterElement)(element, node);
1670 TY_(InsertNodeAfterElement)(node, element);
1677 if ( nodeIsHR(node) )
1680 if ( !TY_(nodeIsElement)(node) )
1682 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1683 TY_(FreeNode)( doc, node);
1687 TY_(ReportError)(doc, element, node, TAG_NOT_ALLOWED_IN);
1694 TY_(InsertNodeAtEnd)(dd, node);
1700 TY_(InsertNodeAtEnd)(dd, node);
1716 if (node->type == EndTag)
1721 if (node->tag == parent->tag)
1724 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE);
1726 if( TY_(IsPushedLast)( doc, element, node ) )
1739 if (!(node->tag->model & CM_INLINE) &&
1742 if ( !TY_(nodeIsElement)(node) )
1744 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1745 TY_(FreeNode)( doc, node);
1750 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_BEFORE);
1752 if (node->tag->model & CM_HEAD && !(node->tag->model & CM_BLOCK))
1754 MoveToHead(doc, element, node);
1764 if (node->tag && !(node->tag->model & CM_HEADING))
1783 if (TY_(nodeIsElement)(node))
1785 if (node->implicit)
1786 TY_(ReportError)(doc, element, node, INSERTING_TAG);
1789 if ( nodeIsBR(node) )
1792 TY_(InsertNodeAtEnd)(element, node);
1793 ParseTag(doc, node, mode);
1798 TY_(ReportError)(doc, element, node, DISCARDING_UNEXPECTED);
1799 TY_(FreeNode)( doc, node );
1804 TY_(ReportError)(doc, element, node, MISSING_ENDTAG_FOR);
1813 Node *node = TY_(GetToken)( doc, mode);
1814 if ( node )
1816 if ( !(node->type == EndTag && node->tag == element->tag) )
1818 TY_(ReportError)(doc, element, node, ELEMENT_NOT_EMPTY);
1823 TY_(FreeNode)( doc, node );
1832 Node *node, *parent;
1839 while ((node = TY_(GetToken)( doc, IgnoreWhitespace)) != NULL)
1841 if (node->tag == list->tag && node->type == EndTag)
1843 TY_(FreeNode)( doc, node);
1849 if (InsertMisc(list, node))
1852 if (TY_(nodeIsText)(node))
1855 node = TY_(InferredTag)(doc, TidyTag_DT);
1856 TY_(ReportError)(doc, list, node, MISSING_STARTTAG);
1859 if (node->tag == NULL)
1861 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
1862 TY_(FreeNode)( doc, node);
1870 if (node->type == EndTag)
1873 if ( nodeIsFORM(node) )
1876 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
1877 TY_(FreeNode)( doc, node );
1892 if (node->tag == parent->tag)
1894 TY_(ReportError)(doc, list, node, MISSING_ENDTAG_BEFORE);
1902 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
1903 TY_(FreeNode)( doc, node);
1909 if ( nodeIsCENTER(node) )
1912 TY_(InsertNodeAfterElement)(list, node);
1915 TY_(InsertNodeBeforeElement)(list, node);
1925 /* ParseTag can destroy node, if it finds that
1930 parent = node->parent;
1934 ParseTag( doc, node, mode);
1938 * unless node has been blown away because the
1941 if (parent->last == node)
1944 TY_(InsertNodeAfterElement)(node, list);
1949 if ( !(nodeIsDT(node) || nodeIsDD(node)) )
1953 if (!(node->tag->model & (CM_BLOCK | CM_INLINE)))
1955 TY_(ReportError)(doc, list, node, TAG_NOT_ALLOWED_IN);
1960 if (!(node->tag->model & CM_INLINE) && lexer->excludeBlocks)
1963 node = TY_(InferredTag)(doc, TidyTag_DD);
1964 TY_(ReportError)(doc, list, node, MISSING_STARTTAG);
1967 if (node->type == EndTag)
1969 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
1970 TY_(FreeNode)( doc, node);
1974 /* node should be <DT> or <DD>*/
1975 TY_(InsertNodeAtEnd)(list, node);
1976 ParseTag( doc, node, IgnoreWhitespace);
1979 TY_(ReportError)(doc, list, node, MISSING_ENDTAG_FOR);
1985 Node *node, *parent;
1992 while ((node = TY_(GetToken)( doc, IgnoreWhitespace)) != NULL)
1994 if (node->tag == list->tag && node->type == EndTag)
1996 TY_(FreeNode)( doc, node);
2002 if (InsertMisc(list, node))
2005 if (node->type != TextNode && node->tag == NULL)
2007 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
2008 TY_(FreeNode)( doc, node);
2016 if (node->type == EndTag)
2018 if ( nodeIsFORM(node) )
2021 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
2022 TY_(FreeNode)( doc, node );
2026 if (node->tag && node->tag->model & CM_INLINE)
2028 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
2029 TY_(PopInline)( doc, node );
2030 TY_(FreeNode)( doc, node);
2042 if (node->tag == parent->tag)
2044 TY_(ReportError)(doc, list, node, MISSING_ENDTAG_BEFORE);
2050 TY_(ReportError)(doc, list, node, DISCARDING_UNEXPECTED);
2051 TY_(FreeNode)( doc, node);
2055 if ( !nodeIsLI(node) )
2059 if (node->tag && (node->tag->model & CM_BLOCK) && lexer->excludeBlocks)
2061 TY_(ReportError)(doc, list, node, MISSING_ENDTAG_BEFORE);
2066 else if ( lexer->exiled && node->tag
2067 && TY_(nodeHasCM)(node, CM_TABLE|CM_ROWGRP|CM_ROW) )
2070 node = TY_(InferredTag)(doc, TidyTag_LI);
2071 TY_(AddStyleProperty)( doc, node, "list-style: none" );
2072 TY_(ReportError)(doc, list, node, MISSING_STARTTAG );
2075 /* node should be <LI> */
2076 TY_(InsertNodeAtEnd)(list,node);
2077 ParseTag( doc, node, IgnoreWhitespace);
2080 TY_(ReportError)(doc, list, node, MISSING_ENDTAG_FOR);
2086 assumes that node hasn't been inserted into the row.
2089 Node *node )
2098 TY_(InsertNodeBeforeElement)( table, node );
2103 TY_(InsertNodeBeforeElement)( row->parent, node );
2126 Node *node;
2132 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2134 if (node->tag == row->tag)
2136 if (node->type == EndTag)
2138 TY_(FreeNode)( doc, node);
2154 if ( node->type == EndTag )
2156 if ( (TY_(nodeHasCM)(node, CM_HTML|CM_TABLE) || nodeIsTABLE(node))
2157 && DescendantOf(row, TagId(node)) )
2163 if ( nodeIsFORM(node) || TY_(nodeHasCM)(node, CM_BLOCK|CM_INLINE) )
2165 if ( nodeIsFORM(node) )
2168 TY_(ReportError)(doc, row, node, DISCARDING_UNEXPECTED);
2169 TY_(FreeNode)( doc, node);
2173 if ( nodeIsTD(node) || nodeIsTH(node) )
2175 TY_(ReportError)(doc, row, node, DISCARDING_UNEXPECTED);
2176 TY_(FreeNode)( doc, node);
2182 if (InsertMisc(row, node))
2186 if (node->tag == NULL && node->type != TextNode)
2188 TY_(ReportError)(doc, row, node, DISCARDING_UNEXPECTED);
2189 TY_(FreeNode)( doc, node);
2194 if ( nodeIsTABLE(node) )
2196 TY_(ReportError)(doc, row, node, DISCARDING_UNEXPECTED);
2197 TY_(FreeNode)( doc, node);
2202 if ( TY_(nodeHasCM)(node, CM_ROWGRP) )
2208 if (node->type == EndTag)
2210 TY_(ReportError)(doc, row, node, DISCARDING_UNEXPECTED);
2211 TY_(FreeNode)( doc, node);
2220 if (node->type != EndTag)
2222 if ( nodeIsFORM(node) )
2225 node = TY_(InferredTag)(doc, TidyTag_TD);
2226 TY_(ReportError)(doc, row, node, MISSING_STARTTAG);
2228 else if ( TY_(nodeIsText)(node)
2229 || TY_(nodeHasCM)(node, CM_BLOCK | CM_INLINE) )
2231 MoveBeforeTable( doc, row, node );
2232 TY_(ReportError)(doc, row, node, TAG_NOT_ALLOWED_IN);
2237 if (node->type != TextNode)
2238 ParseTag( doc, node, IgnoreWhitespace);
2244 else if (node->tag->model & CM_HEAD)
2246 TY_(ReportError)(doc, row, node, TAG_NOT_ALLOWED_IN);
2247 MoveToHead( doc, row, node);
2252 if ( !(nodeIsTD(node) || nodeIsTH(node)) )
2254 TY_(ReportError)(doc, row, node, TAG_NOT_ALLOWED_IN);
2255 TY_(FreeNode)( doc, node);
2259 /* node should be <TD> or <TH> */
2260 TY_(InsertNodeAtEnd)(row, node);
2263 ParseTag( doc, node, IgnoreWhitespace);
2277 Node *node, *parent;
2282 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2284 if (node->tag == rowgroup->tag)
2286 if (node->type == EndTag)
2289 TY_(FreeNode)( doc, node);
2298 if ( nodeIsTABLE(node) && node->type == EndTag )
2305 if (InsertMisc(rowgroup, node))
2309 if (node->tag == NULL && node->type != TextNode)
2311 TY_(ReportError)(doc, rowgroup, node, DISCARDING_UNEXPECTED);
2312 TY_(FreeNode)( doc, node);
2322 if (node->type != EndTag)
2324 if ( nodeIsTD(node) || nodeIsTH(node) )
2327 node = TY_(InferredTag)(doc, TidyTag_TR);
2328 TY_(ReportError)(doc, rowgroup, node, MISSING_STARTTAG);
2330 else if ( TY_(nodeIsText)(node)
2331 || TY_(nodeHasCM)(node, CM_BLOCK|CM_INLINE) )
2333 MoveBeforeTable( doc, rowgroup, node );
2334 TY_(ReportError)(doc, rowgroup, node, TAG_NOT_ALLOWED_IN);
2337 if (node->type != TextNode)
2338 ParseTag(doc, node, IgnoreWhitespace);
2343 else if (node->tag->model & CM_HEAD)
2345 TY_(ReportError)(doc, rowgroup, node, TAG_NOT_ALLOWED_IN);
2346 MoveToHead(doc, rowgroup, node);
2355 if (node->type == EndTag)
2357 if ( nodeIsFORM(node) || TY_(nodeHasCM)(node, CM_BLOCK|CM_INLINE) )
2359 if ( nodeIsFORM(node) )
2362 TY_(ReportError)(doc, rowgroup, node, DISCARDING_UNEXPECTED);
2363 TY_(FreeNode)( doc, node);
2367 if ( nodeIsTR(node) || nodeIsTD(node) || nodeIsTH(node) )
2369 TY_(ReportError)(doc, rowgroup, node, DISCARDING_UNEXPECTED);
2370 TY_(FreeNode)( doc, node);
2378 if (node->tag == parent->tag)
2390 if (node->tag->model & CM_ROWGRP)
2392 if (node->type != EndTag)
2399 if (node->type == EndTag)
2401 TY_(ReportError)(doc, rowgroup, node, DISCARDING_UNEXPECTED);
2402 TY_(FreeNode)( doc, node);
2406 if ( !nodeIsTR(node) )
2408 node = TY_(InferredTag)(doc, TidyTag_TR);
2409 TY_(ReportError)(doc, rowgroup, node, MISSING_STARTTAG);
2413 /* node should be <TR> */
2414 TY_(InsertNodeAtEnd)(rowgroup, node);
2415 ParseTag(doc, node, IgnoreWhitespace);
2422 Node *node, *parent;
2427 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2429 if (node->tag == colgroup->tag && node->type == EndTag)
2431 TY_(FreeNode)( doc, node);
2440 if (node->type == EndTag)
2442 if ( nodeIsFORM(node) )
2445 TY_(ReportError)(doc, colgroup, node, DISCARDING_UNEXPECTED);
2446 TY_(FreeNode)( doc, node);
2454 if (node->tag == parent->tag)
2462 if (TY_(nodeIsText)(node))
2469 if (InsertMisc(colgroup, node))
2473 if (node->tag == NULL)
2475 TY_(ReportError)(doc, colgroup, node, DISCARDING_UNEXPECTED);
2476 TY_(FreeNode)( doc, node);
2480 if ( !nodeIsCOL(node) )
2486 if (node->type == EndTag)
2488 TY_(ReportError)(doc, colgroup, node, DISCARDING_UNEXPECTED);
2489 TY_(FreeNode)( doc, node);
2493 /* node should be <COL> */
2494 TY_(InsertNodeAtEnd)(colgroup, node);
2495 ParseTag(doc, node, IgnoreWhitespace);
2502 Node *node, *parent;
2509 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2511 if (node->tag == table->tag && node->type == EndTag)
2513 TY_(FreeNode)( doc, node);
2520 if (InsertMisc(table, node))
2524 if (node->tag == NULL && node->type != TextNode)
2526 TY_(ReportError)(doc, table, node, DISCARDING_UNEXPECTED);
2527 TY_(FreeNode)( doc, node);
2533 if (node->type != EndTag)
2535 if ( nodeIsTD(node) || nodeIsTH(node) || nodeIsTABLE(node) )
2538 node = TY_(InferredTag)(doc, TidyTag_TR);
2539 TY_(ReportError)(doc, table, node, MISSING_STARTTAG);
2541 else if ( TY_(nodeIsText)(node) ||TY_(nodeHasCM)(node,CM_BLOCK|CM_INLINE) )
2543 TY_(InsertNodeBeforeElement)(table, node);
2544 TY_(ReportError)(doc, table, node, TAG_NOT_ALLOWED_IN);
2547 if (node->type != TextNode)
2548 ParseTag(doc, node, IgnoreWhitespace);
2553 else if (node->tag->model & CM_HEAD)
2555 MoveToHead(doc, table, node);
2564 if (node->type == EndTag)
2566 if ( nodeIsFORM(node) )
2569 TY_(ReportError)(doc, table, node, DISCARDING_UNEXPECTED);
2570 TY_(FreeNode)( doc, node);
2575 if ( TY_(nodeHasCM)(node, CM_TABLE|CM_ROW) ||
2576 TY_(nodeHasCM)(node, CM_BLOCK|CM_INLINE) )
2578 TY_(ReportError)(doc, table, node, DISCARDING_UNEXPECTED);
2579 TY_(FreeNode)( doc, node);
2587 if (node->tag == parent->tag)
2589 TY_(ReportError)(doc, table, node, MISSING_ENDTAG_BEFORE );
2597 if (!(node->tag->model & CM_TABLE))
2600 TY_(ReportError)(doc, table, node, TAG_NOT_ALLOWED_IN);
2605 if (TY_(nodeIsElement)(node))
2607 TY_(InsertNodeAtEnd)(table, node);
2608 ParseTag(doc, node, IgnoreWhitespace);
2613 TY_(ReportError)(doc, table, node, DISCARDING_UNEXPECTED);
2614 TY_(FreeNode)( doc, node);
2617 TY_(ReportError)(doc, table, node, MISSING_ENDTAG_FOR);
2622 static Bool PreContent( TidyDocImpl* ARG_UNUSED(doc), Node* node )
2625 if ( nodeIsP(node) || TY_(nodeIsText)(node) )
2628 if ( node->tag == NULL ||
2629 nodeIsPARAM(node) ||
2630 !TY_(nodeHasCM)(node, CM_INLINE|CM_NEW) )
2638 Node *node;
2645 while ((node = TY_(GetToken)(doc, Preformatted)) != NULL)
2647 if ( node->type == EndTag &&
2648 (node->tag == pre->tag || DescendantOf(pre, TagId(node))) )
2650 if (nodeIsBODY(node) || nodeIsHTML(node))
2652 TY_(ReportError)(doc, pre, node, DISCARDING_UNEXPECTED);
2653 TY_(FreeNode)(doc, node);
2656 if (node->tag == pre->tag)
2658 TY_(FreeNode)(doc, node);
2662 TY_(ReportError)(doc, pre, node, MISSING_ENDTAG_BEFORE );
2670 if (TY_(nodeIsText)(node))
2672 TY_(InsertNodeAtEnd)(pre, node);
2677 if (InsertMisc(pre, node))
2680 if (node->tag == NULL)
2682 TY_(ReportError)(doc, pre, node, DISCARDING_UNEXPECTED);
2683 TY_(FreeNode)(doc, node);
2688 if ( !PreContent(doc, node) )
2693 if (node->type == EndTag)
2695 TY_(ReportError)(doc, pre, node, DISCARDING_UNEXPECTED);
2696 TY_(FreeNode)(doc, node);
2736 TY_(InsertNodeAfterElement)(pre, node);
2737 TY_(ReportError)(doc, pre, node, MISSING_ENDTAG_BEFORE);
2738 ParseTag(doc, node, IgnoreWhitespace);
2743 TY_(InsertNodeAfterElement)(node, pre);
2748 if ( nodeIsP(node) )
2750 if (node->type == StartTag)
2752 TY_(ReportError)(doc, pre, node, USING_BR_INPLACE_OF);
2758 TY_(CoerceNode)(doc, node, TidyTag_BR, no, no);
2759 TY_(FreeAttrs)( doc, node ); /* discard align attribute etc. */
2760 TY_(InsertNodeAtEnd)( pre, node );
2764 TY_(ReportError)(doc, pre, node, DISCARDING_UNEXPECTED);
2765 TY_(FreeNode)( doc, node);
2770 if ( TY_(nodeIsElement)(node) )
2773 if ( nodeIsBR(node) )
2776 TY_(InsertNodeAtEnd)(pre, node);
2777 ParseTag(doc, node, Preformatted);
2782 TY_(ReportError)(doc, pre, node, DISCARDING_UNEXPECTED);
2783 TY_(FreeNode)( doc, node);
2786 TY_(ReportError)(doc, pre, node, MISSING_ENDTAG_FOR);
2792 Node *node;
2796 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2798 if (node->tag == field->tag && node->type == EndTag)
2800 TY_(FreeNode)( doc, node);
2807 if (InsertMisc(field, node))
2810 if ( node->type == StartTag &&
2811 (nodeIsOPTION(node) || nodeIsOPTGROUP(node)) )
2813 if ( nodeIsOPTGROUP(node) )
2814 TY_(ReportError)(doc, field, node, CANT_BE_NESTED);
2816 TY_(InsertNodeAtEnd)(field, node);
2817 ParseTag(doc, node, MixedContent);
2822 TY_(ReportError)(doc, field, node, DISCARDING_UNEXPECTED );
2823 TY_(FreeNode)( doc, node);
2831 Node *node;
2835 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
2837 if (node->tag == field->tag && node->type == EndTag)
2839 TY_(FreeNode)( doc, node);
2846 if (InsertMisc(field, node))
2849 if ( node->type == StartTag &&
2850 ( nodeIsOPTION(node) ||
2851 nodeIsOPTGROUP(node) ||
2852 nodeIsSCRIPT(node))
2855 TY_(InsertNodeAtEnd)(field, node);
2856 ParseTag(doc, node, IgnoreWhitespace);
2861 TY_(ReportError)(doc, field, node, DISCARDING_UNEXPECTED);
2862 TY_(FreeNode)( doc, node);
2865 TY_(ReportError)(doc, field, node, MISSING_ENDTAG_FOR);
2871 Node *node;
2880 while ((node = TY_(GetToken)(doc, mode)) != NULL)
2882 if (node->tag == field->tag && node->type == EndTag)
2884 TY_(FreeNode)( doc, node);
2891 if (InsertMisc(field, node))
2894 if (TY_(nodeIsText)(node))
2900 if (node->start >= node->end)
2902 TY_(FreeNode)( doc, node);
2906 TY_(InsertNodeAtEnd)(field, node);
2913 if ( node->tag
2914 && node->tag->model & CM_INLINE
2915 && !(node->tag->model & CM_FIELD)) /* #487283 - fix by Lee Passey 25 Jan 02 */
2917 TY_(ReportError)(doc, field, node, DISCARDING_UNEXPECTED);
2918 TY_(FreeNode)( doc, node);
2924 TY_(ReportError)(doc, field, node, MISSING_ENDTAG_BEFORE);
2932 TY_(ReportError)(doc, field, node, MISSING_ENDTAG_FOR);
2938 Node *node;
2939 while ((node = TY_(GetToken)(doc, MixedContent)) != NULL)
2941 if (node->tag == title->tag && node->type == StartTag)
2943 TY_(ReportError)(doc, title, node, COERCE_TO_ENDTAG);
2944 node->type = EndTag;
2948 else if (node->tag == title->tag && node->type == EndTag)
2950 TY_(FreeNode)( doc, node);
2956 if (TY_(nodeIsText)(node))
2960 TrimInitialSpace(doc, title, node);
2962 if (node->start >= node->end)
2964 TY_(FreeNode)( doc, node);
2968 TY_(InsertNodeAtEnd)(title, node);
2973 if (InsertMisc(title, node))
2977 if (node->tag == NULL)
2979 TY_(ReportError)(doc, title, node, DISCARDING_UNEXPECTED);
2980 TY_(FreeNode)( doc, node);
2985 TY_(ReportError)(doc, title, node, MISSING_ENDTAG_BEFORE);
2991 TY_(ReportError)(doc, title, node, MISSING_ENDTAG_FOR);
3003 Node *node;
3006 node = TY_(GetToken)(doc, CdataContent);
3009 if (node)
3011 TY_(InsertNodeAtEnd)(script, node);
3020 node = TY_(GetToken)(doc, IgnoreWhitespace);
3022 if (!(node && node->type == EndTag && node->tag &&
3023 node->tag->id == script->tag->id))
3025 TY_(ReportError)(doc, script, node, MISSING_ENDTAG_FOR);
3027 if (node)
3032 TY_(FreeNode)(doc, node);
3036 Bool TY_(IsJavaScript)(Node *node)
3041 if (node->attributes == NULL)
3044 for (attr = node->attributes; attr; attr = attr->next)
3060 Node *node;
3064 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
3066 if (node->tag == head->tag && node->type == EndTag)
3068 TY_(FreeNode)( doc, node);
3075 if ((node->tag == head->tag || nodeIsHTML(node)) && node->type == StartTag)
3077 TY_(ReportError)(doc, head, node, DISCARDING_UNEXPECTED);
3078 TY_(FreeNode)(doc, node);
3082 if (TY_(nodeIsText)(node))
3084 TY_(ReportError)(doc, head, node, TAG_NOT_ALLOWED_IN);
3089 if (node->type == ProcInsTag && node->element &&
3090 TY_(tmbstrcmp)(node->element, "xml-stylesheet") == 0)
3092 TY_(ReportError)(doc, head, node, TAG_NOT_ALLOWED_IN);
3093 TY_(InsertNodeBeforeElement)(TY_(FindHTML)(doc), node);
3098 if (InsertMisc(head, node))
3101 if (node->type == DocTypeTag)
3103 InsertDocType(doc, head, node);
3108 if (node->tag == NULL)
3110 TY_(ReportError)(doc, head, node, DISCARDING_UNEXPECTED);
3111 TY_(FreeNode)( doc, node);
3120 if (!(node->tag->model & CM_HEAD))
3124 TY_(ReportError)(doc, head, node, TAG_NOT_ALLOWED_IN );
3129 if (TY_(nodeIsElement)(node))
3131 if ( nodeIsTITLE(node) )
3137 TY_(ReportError)(doc, head, node, TOO_MANY_ELEMENTS_IN);
3139 TY_(ReportError)(doc, head, node, TOO_MANY_ELEMENTS);
3141 else if ( nodeIsBASE(node) )
3147 TY_(ReportError)(doc, head, node, TOO_MANY_ELEMENTS_IN);
3149 TY_(ReportError)(doc, head, node, TOO_MANY_ELEMENTS);
3151 else if ( nodeIsNOSCRIPT(node) )
3153 TY_(ReportError)(doc, head, node, TAG_NOT_ALLOWED_IN);
3157 else if (nodeIsMETA(node))
3159 AttVal * httpEquiv = AttrGetById(node, TidyAttr_HTTP_EQUIV);
3160 AttVal * content = AttrGetById(node, TidyAttr_CONTENT);
3199 TY_(InsertNodeAtEnd)(head, node);
3200 ParseTag(doc, node, IgnoreWhitespace);
3205 TY_(ReportError)(doc, head, node, DISCARDING_UNEXPECTED);
3206 TY_(FreeNode)( doc, node);
3213 Node *node;
3221 while ((node = TY_(GetToken)(doc, mode)) != NULL)
3224 if (node->tag == body->tag && node->type == StartTag)
3226 TY_(ReportError)(doc, body, node, DISCARDING_UNEXPECTED);
3227 TY_(FreeNode)(doc, node);
3232 if ( nodeIsHTML(node) )
3234 if (TY_(nodeIsElement)(node) || lexer->seenEndHtml)
3235 TY_(ReportError)(doc, body, node, DISCARDING_UNEXPECTED);
3239 TY_(FreeNode)( doc, node);
3244 ( node->type == StartTag ||
3245 node->type == EndTag ||
3246 node->type == StartEndTag ) )
3248 TY_(ReportError)(doc, body, node, CONTENT_AFTER_BODY );
3251 if ( node->tag == body->tag && node->type == EndTag )
3255 TY_(FreeNode)( doc, node);
3265 if ( nodeIsNOFRAMES(node) )
3267 if (node->type == StartTag)
3269 TY_(InsertNodeAtEnd)(body, node);
3270 TY_(ParseBlock)(doc, node, mode);
3274 if (node->type == EndTag && nodeIsNOFRAMES(body->parent) )
3282 if ( (nodeIsFRAME(node) || nodeIsFRAMESET(node))
3292 if ( TY_(nodeIsText)(node) &&
3293 node->end <= node->start + 1 &&
3294 lexer->lexbuf[node->start] == ' ' )
3298 if (InsertMisc(body, node))
3306 TY_(ReportError)(doc, body, node, CONTENT_AFTER_BODY);
3311 if (TY_(nodeIsText)(node))
3315 TY_(FreeNode)( doc, node);
3326 if ( TY_(InlineDup)(doc, node) > 0 )
3330 TY_(InsertNodeAtEnd)(body, node);
3335 if (node->type == DocTypeTag)
3337 InsertDocType(doc, body, node);
3341 if ( node->tag == NULL || nodeIsPARAM(node) )
3343 TY_(ReportError)(doc, body, node, DISCARDING_UNEXPECTED);
3344 TY_(FreeNode)( doc, node);
3356 if ( nodeIsINPUT(node) ||
3357 (!TY_(nodeHasCM)(node, CM_BLOCK) && !TY_(nodeHasCM)(node, CM_INLINE))
3361 if (!(node->tag->model & CM_HEAD))
3362 TY_(ReportError)(doc, body, node, TAG_NOT_ALLOWED_IN);
3364 if (node->tag->model & CM_HTML)
3367 if ( nodeIsBODY(node) && body->implicit
3370 body->attributes = node->attributes;
3371 node->attributes = NULL;
3374 TY_(FreeNode)( doc, node);
3378 if (node->tag->model & CM_HEAD)
3380 MoveToHead(doc, body, node);
3384 if (node->tag->model & CM_LIST)
3387 node = TY_(InferredTag)(doc, TidyTag_UL);
3388 AddClassNoIndent(doc, node);
3391 else if (node->tag->model & CM_DEFLIST)
3394 node = TY_(InferredTag)(doc, TidyTag_DL);
3397 else if (node->tag->model & (CM_TABLE | CM_ROWGRP | CM_ROW))
3400 node = TY_(InferredTag)(doc, TidyTag_TABLE);
3403 else if ( nodeIsINPUT(node) )
3406 node = TY_(InferredTag)(doc, TidyTag_FORM);
3411 if ( !TY_(nodeHasCM)(node, CM_ROW | CM_FIELD) )
3418 TY_(FreeNode)( doc, node );
3423 if (node->type == EndTag)
3425 if ( nodeIsBR(node) )
3426 node->type = StartTag;
3427 else if ( nodeIsP(node) )
3429 node->type = StartEndTag;
3430 node->implicit = yes;
3432 TY_(CoerceNode)(doc, node, TidyTag_BR, no, no);
3433 FreeAttrs( doc, node ); /* discard align attribute etc. */
3434 TY_(InsertNodeAtEnd)(body, node);
3435 node = TY_(InferredTag)(doc, TidyTag_BR);
3438 else if ( TY_(nodeHasCM)(node, CM_INLINE) )
3439 TY_(PopInline)( doc, node );
3442 if (TY_(nodeIsElement)(node))
3444 if ( TY_(nodeHasCM)(node, CM_INLINE) && !TY_(nodeHasCM)(node, CM_MIXED) )
3448 if ( nodeIsIMG(node) )
3453 if (checkstack && !node->implicit)
3457 if ( TY_(InlineDup)(doc, node) > 0 )
3469 if (node->implicit)
3470 TY_(ReportError)(doc, body, node, INSERTING_TAG);
3472 TY_(InsertNodeAtEnd)(body, node);
3473 ParseTag(doc, node, mode);
3478 TY_(ReportError)(doc, body, node, DISCARDING_UNEXPECTED);
3479 TY_(FreeNode)( doc, node);
3486 Node *node;
3494 while ( (node = TY_(GetToken)(doc, mode)) != NULL )
3496 if ( node->tag == noframes->tag && node->type == EndTag )
3498 TY_(FreeNode)( doc, node);
3504 if ( nodeIsFRAME(node) || nodeIsFRAMESET(node) )
3507 if (node->type == EndTag)
3509 TY_(ReportError)(doc, noframes, node, DISCARDING_UNEXPECTED);
3510 TY_(FreeNode)( doc, node); /* Throw it away */
3514 TY_(ReportError)(doc, noframes, node, MISSING_ENDTAG_BEFORE);
3520 if ( nodeIsHTML(node) )
3522 if (TY_(nodeIsElement)(node))
3523 TY_(ReportError)(doc, noframes, node, DISCARDING_UNEXPECTED);
3525 TY_(FreeNode)( doc, node);
3530 if (InsertMisc(noframes, node))
3533 if ( nodeIsBODY(node) && node->type == StartTag )
3536 TY_(InsertNodeAtEnd)(noframes, node);
3537 ParseTag(doc, node, IgnoreWhitespace /*MixedContent*/);
3540 if (seen_body && TY_(FindBody)(doc) != node)
3542 TY_(CoerceNode)(doc, node, TidyTag_DIV, no, no);
3543 MoveNodeToBody(doc, node);
3549 if (TY_(nodeIsText)(node) || (node->tag && node->type != EndTag))
3556 TY_(ReportError)(doc, noframes, node, DISCARDING_UNEXPECTED);
3557 TY_(FreeNode)( doc, node);
3560 if ( TY_(nodeIsText)(node) )
3563 node = TY_(InferredTag)(doc, TidyTag_P);
3564 TY_(ReportError)(doc, noframes, node, CONTENT_AFTER_BODY );
3566 TY_(InsertNodeAtEnd)( body, node );
3571 node = TY_(InferredTag)(doc, TidyTag_BODY);
3573 TY_(ReportError)(doc, noframes, node, INSERTING_TAG);
3574 TY_(InsertNodeAtEnd)( noframes, node );
3577 ParseTag( doc, node, IgnoreWhitespace /*MixedContent*/ );
3582 TY_(ReportError)(doc, noframes, node, DISCARDING_UNEXPECTED);
3583 TY_(FreeNode)( doc, node);
3586 TY_(ReportError)(doc, noframes, node, MISSING_ENDTAG_FOR);
3592 Node *node;
3599 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
3601 if (node->tag == frameset->tag && node->type == EndTag)
3603 TY_(FreeNode)( doc, node);
3610 if (InsertMisc(frameset, node))
3613 if (node->tag == NULL)
3615 TY_(ReportError)(doc, frameset, node, DISCARDING_UNEXPECTED);
3616 TY_(FreeNode)( doc, node);
3620 if (TY_(nodeIsElement)(node))
3622 if (node->tag && node->tag->model & CM_HEAD)
3624 MoveToHead(doc, frameset, node);
3629 if ( nodeIsBODY(node) )
3632 node = TY_(InferredTag)(doc, TidyTag_NOFRAMES);
3633 TY_(ReportError)(doc, frameset, node, INSERTING_TAG);
3636 if (node->type == StartTag && (node->tag->model & CM_FRAMES))
3638 TY_(InsertNodeAtEnd)(frameset, node);
3640 ParseTag(doc, node, MixedContent);
3643 else if (node->type == StartEndTag && (node->tag->model & CM_FRAMES))
3645 TY_(InsertNodeAtEnd)(frameset, node);
3650 TY_(ReportError)(doc, frameset, node, DISCARDING_UNEXPECTED);
3651 TY_(FreeNode)( doc, node);
3654 TY_(ReportError)(doc, frameset, node, MISSING_ENDTAG_FOR);
3659 Node *node, *head;
3667 node = TY_(GetToken)(doc, IgnoreWhitespace);
3669 if (node == NULL)
3671 node = TY_(InferredTag)(doc, TidyTag_HEAD);
3675 if ( nodeIsHEAD(node) )
3678 if (node->tag == html->tag && node->type == EndTag)
3680 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3681 TY_(FreeNode)( doc, node);
3686 if (node->tag == html->tag && node->type == StartTag)
3688 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3689 TY_(FreeNode)(doc, node);
3694 if (InsertMisc(html, node))
3698 node = TY_(InferredTag)(doc, TidyTag_HEAD);
3702 head = node;
3708 node = TY_(GetToken)(doc, IgnoreWhitespace);
3710 if (node == NULL)
3714 node = TY_(InferredTag)(doc, TidyTag_BODY);
3715 TY_(InsertNodeAtEnd)(html, node);
3716 TY_(ParseBody)(doc, node, mode);
3723 if (node->tag == html->tag)
3725 if (node->type != StartTag && frameset == NULL)
3726 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3728 TY_(FreeNode)( doc, node);
3733 if (InsertMisc(html, node))
3737 if ( nodeIsBODY(node) )
3739 if (node->type != StartTag)
3741 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3742 TY_(FreeNode)( doc, node);
3774 if ( nodeIsFRAMESET(node) )
3776 if (node->type != StartTag)
3778 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3779 TY_(FreeNode)( doc, node);
3784 TY_(ReportFatal)(doc, html, node, DUPLICATE_FRAMESET);
3786 frameset = node;
3788 TY_(InsertNodeAtEnd)(html, node);
3789 ParseTag(doc, node, mode);
3796 for (node = frameset->content; node; node = node->next)
3798 if ( nodeIsNOFRAMES(node) )
3799 noframes = node;
3805 if ( nodeIsNOFRAMES(node) )
3807 if (node->type != StartTag)
3809 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3810 TY_(FreeNode)( doc, node);
3816 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3817 TY_(FreeNode)( doc, node);
3818 node = TY_(InferredTag)(doc, TidyTag_BODY);
3824 noframes = node;
3828 TY_(FreeNode)( doc, node);
3834 if (TY_(nodeIsElement)(node))
3836 if (node->tag && node->tag->model & CM_HEAD)
3838 MoveToHead(doc, html, node);
3843 if ( frameset != NULL && nodeIsFRAME(node) )
3845 TY_(ReportError)(doc, html, node, DISCARDING_UNEXPECTED);
3846 TY_(FreeNode)(doc, node);
3864 TY_(ReportError)(doc, html, node, NOFRAMES_CONTENT);
3874 node = TY_(InferredTag)(doc, TidyTag_BODY);
3879 /* node must be body */
3881 TY_(InsertNodeAtEnd)(html, node);
3882 ParseTag(doc, node, mode);
3885 static Bool nodeCMIsOnlyInline( Node* node )
3887 return TY_(nodeHasCM)( node, CM_INLINE ) && !TY_(nodeHasCM)( node, CM_BLOCK );
3892 Node* node;
3898 node = body->content;
3900 while (node)
3902 if ((TY_(nodeIsText)(node) && !TY_(IsBlank)(doc->lexer, node)) ||
3903 (TY_(nodeIsElement)(node) && nodeCMIsOnlyInline(node)))
3906 TY_(InsertNodeBeforeElement)(node, p);
3907 while (node && (!TY_(nodeIsElement)(node) || nodeCMIsOnlyInline(node)))
3909 Node* next = node->next;
3910 TY_(RemoveNode)(node);
3911 TY_(InsertNodeAtEnd)(p, node);
3912 node = next;
3917 node = node->next;
3924 static void EncloseBlockText(TidyDocImpl* doc, Node* node)
3929 while (node)
3931 next = node->next;
3933 if (node->content)
3934 EncloseBlockText(doc, node->content);
3936 if (!(nodeIsFORM(node) || nodeIsNOSCRIPT(node) ||
3937 nodeIsBLOCKQUOTE(node))
3938 || !node->content)
3940 node = next;
3944 block = node->content;
3963 node = next;
3967 static void ReplaceObsoleteElements(TidyDocImpl* doc, Node* node)
3971 while (node)
3973 next = node->next;
3975 if (nodeIsDIR(node) || nodeIsMENU(node))
3976 TY_(CoerceNode)(doc, node, TidyTag_UL, yes, yes);
3978 if (nodeIsXMP(node) || nodeIsLISTING(node) ||
3979 (node->tag && node->tag->id == TidyTag_PLAINTEXT))
3980 TY_(CoerceNode)(doc, node, TidyTag_PRE, yes, yes);
3982 if (node->content)
3983 ReplaceObsoleteElements(doc, node->content);
3985 node = next;
3989 static void AttributeChecks(TidyDocImpl* doc, Node* node)
3993 while (node)
3995 next = node->next;
3997 if (TY_(nodeIsElement)(node))
3999 if (node->tag->chkattrs)
4000 node->tag->chkattrs(doc, node);
4002 TY_(CheckAttributes)(doc, node);
4005 if (node->content)
4006 AttributeChecks(doc, node->content);
4008 node = next;
4016 static void SanitizeNodesAgainstXSS(TidyDocImpl* doc, Node* node)
4023 while (node)
4025 next = node->next;
4029 shouldRemoveElement = TY_(nodeIsFRAMESET) (node) ||
4030 TY_(nodeIsSCRIPT) (node) ||
4031 TY_(nodeIsIFRAME) (node) ||
4032 TY_(nodeIsOBJECT) (node) ||
4033 TY_(nodeIsFRAME) (node) ||
4034 TY_(nodeIsEMBED) (node) ||
4035 TY_(nodeIsSTYLE) (node) ||
4036 TY_(nodeIsLINK) (node) ||
4037 TY_(nodeIsMETA) (node) ||
4038 TY_(nodeIsAPPLET) (node) ;
4044 shouldRemoveElement = node->element && (!TY_(tmbstrcasecmp)(node->element, "frameset") ||
4045 !TY_(tmbstrcasecmp)(node->element, "script") ||
4046 !TY_(tmbstrcasecmp)(node->element, "iframe") ||
4047 !TY_(tmbstrcasecmp)(node->element, "object") ||
4048 !TY_(tmbstrcasecmp)(node->element, "frame") ||
4049 !TY_(tmbstrcasecmp)(node->element, "embed") ||
4050 !TY_(tmbstrcasecmp)(node->element, "style") ||
4051 !TY_(tmbstrcasecmp)(node->element, "link") ||
4052 !TY_(tmbstrcasecmp)(node->element, "meta") ||
4053 !TY_(tmbstrcasecmp)(node->element, "applet") );
4058 RemoveNode(node);
4059 FreeNode(doc, node);
4061 else if (node->content)
4063 SanitizeNodesAgainstXSS(doc, node->content);
4066 node = next;
4076 Node *node, *html, *doctype = NULL;
4078 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
4080 if (node->type == XmlDecl)
4084 TY_(ReportError)(doc, &doc->root, node, DISCARDING_UNEXPECTED);
4085 TY_(FreeNode)(doc, node);
4088 if (node->line != 1 || (node->line == 1 && node->column != 1))
4090 TY_(ReportError)(doc, &doc->root, node, SPACE_PRECEDING_XMLDECL);
4094 if (node->type == XmlDecl)
4096 AttVal* encoding = GetAttrByName(node, "encoding");
4111 if (InsertMisc( &doc->root, node ))
4114 if (node->type == DocTypeTag)
4118 TY_(InsertNodeAtEnd)( &doc->root, node);
4119 doctype = node;
4123 TY_(ReportError)(doc, &doc->root, node, DISCARDING_UNEXPECTED);
4124 TY_(FreeNode)( doc, node);
4129 if (node->type == EndTag)
4131 TY_(ReportError)(doc, &doc->root, node, DISCARDING_UNEXPECTED);
4132 TY_(FreeNode)( doc, node);
4136 if (node->type == StartTag && nodeIsHTML(node))
4140 xmlns = TY_(AttrGetById)(node, TidyAttr_XMLNS);
4158 if ( node->type != StartTag || !nodeIsHTML(node) )
4164 html = node;
4249 Node *node;
4251 /* if node is pre or has xml:space="preserve" then do so */
4256 while ((node = TY_(GetToken)(doc, mode)) != NULL)
4258 if (node->type == EndTag &&
4259 node->element && element->element &&
4260 TY_(tmbstrcmp)(node->element, element->element) == 0)
4262 TY_(FreeNode)( doc, node);
4268 if (node->type == EndTag)
4271 TY_(ReportFatal)(doc, element, node, UNEXPECTED_ENDTAG_IN);
4273 TY_(ReportFatal)(doc, element, node, UNEXPECTED_ENDTAG);
4275 TY_(FreeNode)( doc, node);
4280 if (node->type == StartTag)
4281 ParseXMLElement( doc, node, mode );
4283 TY_(InsertNodeAtEnd)(element, node);
4288 delete text node if it is empty.
4291 node = element->content;
4293 if (TY_(nodeIsText)(node) && mode != Preformatted)
4295 if ( lexer->lexbuf[node->start] == ' ' )
4297 node->start++;
4299 if (node->start >= node->end)
4300 TY_(DiscardElement)( doc, node );
4306 delete the text node if it is empty
4309 node = element->last;
4311 if (TY_(nodeIsText)(node) && mode != Preformatted)
4313 if ( lexer->lexbuf[node->end - 1] == ' ' )
4315 node->end--;
4317 if (node->start >= node->end)
4318 TY_(DiscardElement)( doc, node );
4325 Node *node, *doctype = NULL;
4329 while ((node = TY_(GetToken)(doc, IgnoreWhitespace)) != NULL)
4332 if (node->type == EndTag)
4334 TY_(ReportError)(doc, NULL, node, UNEXPECTED_ENDTAG);
4335 TY_(FreeNode)( doc, node);
4340 if (InsertMisc( &doc->root, node))
4343 if (node->type == DocTypeTag)
4347 TY_(InsertNodeAtEnd)( &doc->root, node);
4348 doctype = node;
4352 TY_(ReportError)(doc, &doc->root, node, DISCARDING_UNEXPECTED);
4353 TY_(FreeNode)( doc, node);
4358 if (node->type == StartEndTag)
4360 TY_(InsertNodeAtEnd)( &doc->root, node);
4365 if (node->type == StartTag)
4367 TY_(InsertNodeAtEnd)( &doc->root, node );
4368 ParseXMLElement( doc, node, IgnoreWhitespace );
4372 TY_(ReportError)(doc, &doc->root, node, DISCARDING_UNEXPECTED);
4373 TY_(FreeNode)( doc, node);