public static final IMarkupFragment findTagMarkup()

in wicket-core/src/main/java/org/apache/wicket/markup/TagUtils.java [232:303]


	public static final IMarkupFragment findTagMarkup(IMarkupFragment fragment, String id, String tagName, int streamOffset)
	{
		/*
		 * We need streamOffset because MarkupFragment starts searching from offset 1.
		 */
		Args.notEmpty(id, "id");
		Args.withinRange(0, fragment.size() - 1, streamOffset, "streamOffset");

		Deque<Boolean> openTagUsability = new LinkedList<>();
		boolean canFind = true;

		MarkupStream stream = new MarkupStream(fragment);
		stream.setCurrentIndex(streamOffset);
		while (stream.isCurrentIndexInsideTheStream())
		{
			MarkupElement elem = stream.get();

			if (elem instanceof ComponentTag)
			{
				ComponentTag tag = stream.getTag();

				if (tag.isOpen() || tag.isOpenClose())
				{
					if (canFind && tag.getId().equals(id) && (tagName==null || tag.getName().equals(tagName)))
					{
						return stream.getMarkupFragment();
					}
					else if (tag.isOpen() && !tag.hasNoCloseTag())
					{
						openTagUsability.push(canFind);

						if (tag instanceof WicketTag)
						{
							WicketTag wtag = (WicketTag)tag;

							if (wtag.isExtendTag())
							{
								canFind = true;
							}
							else if (wtag.isFragmentTag() || wtag.isContainerTag())
							{
								canFind = false;
							}
							/*
							 * We should potentially also not try find child markup inside some other
							 * Wicket tags. Other tags that we should think about refusing to look for
							 * child markup inside include: container, body, border, child (we already
							 * have special extend handling).
							 */
						}
						else if (!"head".equals(tag.getName()) && !tag.isAutoComponentTag())
						{
							canFind = false;
						}
					}
				}
				else if (tag.isClose())
				{
					if (openTagUsability.isEmpty())
					{
						canFind = false;
					}
					else
					{
						canFind = openTagUsability.pop();
					}
				}
			}
			stream.next();
		}
		return null;
	}