jodd-lagarto/src/main/java/jodd/lagarto/dom/HtmlFosterRules.java
protected boolean findFosterNodes(final Node node) {
		boolean isTable = false;

		if (!lastTables.isEmpty()) {
			// if inside table
			if (node.getNodeType() == Node.NodeType.TEXT) {
				String value = node.getNodeValue();
				if (!StringUtil.isBlank(value)) {
					if (isParentNodeOneOfFosterTableElements(node.getParentNode())) {
						fosterTexts.add((Text) node);
					}
				}
			}
		}

		if (node.getNodeType() == Node.NodeType.ELEMENT) {
			Element element = (Element) node;

			isTable = isTableElement(node);

			if (isTable) {
				// if node is a table, add it to the stack-of-last-tables
				lastTables.add(element);
			} else {
				// otherwise...

				// ...if inside the table
				if (!lastTables.isEmpty()) {
					// check this and parent
					Node parentNode = node.getParentNode();
					if (
							isParentNodeOneOfFosterTableElements(parentNode) &&
							!isOneOfTableElements(element)
							) {

						String elementNodeName = element.getNodeName().toLowerCase();
						if (elementNodeName.equals("form")) {
							if (element.getChildNodesCount() > 0) {
								// if form element, take all its child nodes
								// and add after the from element
								Node[] formChildNodes = element.getChildNodes();
								parentNode.insertAfter(formChildNodes, element);
								return false;
							} else {
								// empty form element, leave it where it is
								return true;
							}
						}

						if (elementNodeName.equals("input")) {
							String inputType = element.getAttribute("type");

							if (inputType.equals("hidden")) {
								// input hidden elements remains as they are
								return true;
							}
						}

						// foster element found, remember it to process it later
						fosterElements.add(element);
					}

				} else {
					// ...if not inside the table, just keep going
				}
			}
		}

		allchilds:
		while (true) {
			int childs = node.getChildNodesCount();
			for (int i = 0; i < childs; i++) {
				Node childNode = node.getChild(i);

				boolean done = findFosterNodes(childNode);
				if (!done) {
					continue allchilds;
				}
			}
			break;
		}

		if (isTable) {
			// remove last element
			int size = lastTables.size();
			if (size > 0) {
				lastTables.remove(size - 1);	// no array copy occurs when the last element is removed
			}
		}
		return true;
	}
protected boolean findFosterNodes(final Node node) {
		boolean isTable = false;

		if (!lastTables.isEmpty()) {
			// if inside table
			if (node.getNodeType() == Node.NodeType.TEXT) {
				String value = node.getNodeValue();
				if (!StringUtil.isBlank(value)) {
					if (isParentNodeOneOfFosterTableElements(node.getParentNode())) {
						fosterTexts.add((Text) node);
					}
				}
			}
		}

		if (node.getNodeType() == Node.NodeType.ELEMENT) {
			Element element = (Element) node;

			isTable = isTableElement(node);

			if (isTable) {
				// if node is a table, add it to the stack-of-last-tables
				lastTables.add(element);
			} else {
				// otherwise...

				// ...if inside the table
				if (!lastTables.isEmpty()) {
					// check this and parent
					Node parentNode = node.getParentNode();
					if (
							isParentNodeOneOfFosterTableElements(parentNode) &&
							!isOneOfTableElements(element)
							) {

						String elementNodeName = element.getNodeName().toLowerCase();
						if (elementNodeName.equals("form")) {
							if (element.getChildNodesCount() > 0) {
								// if form element, take all its child nodes
								// and add after the from element
								Node[] formChildNodes = element.getChildNodes();
								parentNode.insertAfter(formChildNodes, element);
								return false;
							} else {
								// empty form element, leave it where it is
								return true;
							}
						}

						if (elementNodeName.equals("input")) {
							String inputType = element.getAttribute("type");

							if (inputType.equals("hidden")) {
								// input hidden elements remains as they are
								return true;
							}
						}

						// foster element found, remember it to process it later
						fosterElements.add(element);
					}

				} else {
					// ...if not inside the table, just keep going
				}
			}
		}

		allchilds:
		while (true) {
			int childs = node.getChildNodesCount();
			for (int i = 0; i < childs; i++) {
				Node childNode = node.getChild(i);

				boolean done = findFosterNodes(childNode);
				if (!done) {
					continue allchilds;
				}
			}
			break;
		}

		if (isTable) {
			// remove last element
			int size = lastTables.size();
			if (size > 0) {
				lastTables.remove(size - 1);	// no array copy occurs when the last element is removed
			}
		}
		return true;
	}
protected boolean findFosterNodes ( final Node node ) { boolean isTable = false ; if ( ! lastTables . isEmpty ( ) ) { // if inside table if ( node . getNodeType ( ) == Node . NodeType . TEXT ) { String value = node . getNodeValue ( ) ; if ( ! StringUtil . isBlank ( value ) ) { if ( isParentNodeOneOfFosterTableElements ( node . getParentNode ( ) ) ) { fosterTexts . add ( ( Text ) node ) ; } } } } if ( node . getNodeType ( ) == Node . NodeType . ELEMENT ) { Element element = ( Element ) node ; isTable = isTableElement ( node ) ; if ( isTable ) { // if node is a table, add it to the stack-of-last-tables lastTables . add ( element ) ; } else { // otherwise... // ...if inside the table if ( ! lastTables . isEmpty ( ) ) { // check this and parent Node parentNode = node . getParentNode ( ) ; if ( isParentNodeOneOfFosterTableElements ( parentNode ) && ! isOneOfTableElements ( element ) ) { String elementNodeName = element . getNodeName ( ) . toLowerCase ( ) ; if ( elementNodeName . equals ( "form" ) ) { if ( element . getChildNodesCount ( ) > 0 ) { // if form element, take all its child nodes // and add after the from element Node [ ] formChildNodes = element . getChildNodes ( ) ; parentNode . insertAfter ( formChildNodes , element ) ; return false ; } else { // empty form element, leave it where it is return true ; } } if ( elementNodeName . equals ( "input" ) ) { String inputType = element . getAttribute ( "type" ) ; if ( inputType . equals ( "hidden" ) ) { // input hidden elements remains as they are return true ; } } // foster element found, remember it to process it later fosterElements . add ( element ) ; } } else { // ...if not inside the table, just keep going } } } allchilds : while ( true ) { int childs = node . getChildNodesCount ( ) ; for ( int i = 0 ; i < childs ; i ++ ) { Node childNode = node . getChild ( i ) ; boolean done = findFosterNodes ( childNode ) ; if ( ! done ) { continue allchilds ; } } break ; } if ( isTable ) { // remove last element int size = lastTables . size ( ) ; if ( size > 0 ) { lastTables . remove ( size - 1 ) ; // no array copy occurs when the last element is removed } } return true ; }
Finds foster elements. Returns <code>true</code> if there was no change in
DOM tree of the parent element. Otherwise, returns <code>false</code>
meaning that parent will scan its childs again.
Finds foster elements . Returns <code > true< / code > if there was no change in DOM tree of the parent element . Otherwise returns <code > false< / code > meaning that parent will scan its childs again .