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;
}