Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.apache.wicket.markup.parser.filter;
 
 import java.util.Map;
 
This is a markup inline filter. It identifies HTML specific issues which make HTML not 100% xml compliant. E.g. tags like <p> often are missing the corresponding close tag.

Author(s):
Juergen Donnerstag
 
 public final class HtmlHandler extends AbstractMarkupFilter
 {
Logging
 
 	private static final Logger log = LoggerFactory.getLogger(HtmlHandler.class);

Tag stack to find balancing tags
 
 	final private ArrayListStack stack = new ArrayListStack();

Map of simple tags.
 
 	private static final Map doesNotRequireCloseTag = new HashMap();
 
 	static
 	{
 		// Tags which are allowed not be closed in HTML
 	}

Construct.
 
 	public HtmlHandler()
 	{
 	}

Get the next MarkupElement from the parent MarkupFilter and handle it if the specific filter criteria are met. Depending on the filter, it may return the MarkupElement unchanged, modified or it remove by asking the parent handler for the next tag.

Returns:
Return the next eligible MarkupElement
See also:
org.apache.wicket.markup.parser.IMarkupFilter.nextTag()
 
 	public MarkupElement nextTag() throws ParseException
 	{
 		// Get the next tag. If null, no more tags are available
 		final ComponentTag tag = (ComponentTag)getParent().nextTag();
 		if (tag == null)
 		{
 			// No more tags from the markup.
 			// If there's still a non-simple tag left, it's an error
 			while (.size() > 0)
 			{
 				final ComponentTag top = (ComponentTag).peek();
 
 				if (!requiresCloseTag(top.getName()))
 				{
 					.pop();
 				}
 				else
 				{
 					throw new ParseException("Tag " + top + " at " + top.getPos() +
 						" did not have a close tag"top.getPos());
 				}
 			}
 
 			return tag;
 		}
		{
			.debug("tag: " + tag.toUserDebugString() + ", stack: " + );
		}
		// Check tag type
		if (tag.isOpen())
		{
			// Push onto stack
			.push(tag);
		}
		else if (tag.isClose())
		{
			// Check that there is something on the stack
			if (.size() > 0)
			{
				// Pop the top tag off the stack
				// If the name of the current close tag does not match the
				// tag on the stack then we may have a mismatched close tag
				boolean mismatch = !top.hasEqualTagName(tag);
				if (mismatch)
				{
					// Pop any simple tags off the top of the stack
					while (mismatch && !requiresCloseTag(top.getName()))
					{
						// Pop simple tag
						// Does new top of stack mismatch too?
						mismatch = !top.hasEqualTagName(tag);
					}
					// If adjusting for simple tags did not fix the problem,
					// it must be a real mismatch.
					if (mismatch)
					{
						throw new ParseException("Tag " + top.toUserDebugString() +
							" has a mismatched close tag at " + tag.toUserDebugString(),
							top.getPos());
					}
				}
				// Tag matches, so add pointer to matching tag
				tag.setOpenTag(top);
			}
			else
			{
				throw new ParseException("Tag " + tag.toUserDebugString() +
					" does not have a matching open tag"tag.getPos());
			}
		}
		else if (tag.isOpenClose())
		{
			// Tag closes itself
			tag.setOpenTag(tag);
		}
		return tag;
	}

Gets whether this tag does not require a closing tag.

Parameters:
name The tag's name, e.g. a, br, div, etc.
Returns:
True if this tag does not require a closing tag
	public static boolean requiresCloseTag(final String name)
	{
		return .get(name.toLowerCase()) == null;
	}
New to GrepCode? Check out our FAQ X