}
} else if (m instanceof CloseMarker) {
closeM = (CloseMarker) m;
lastTag = (stack.size() > 0) ? stack.get(0) : null;
// Validate tag type
TagType targetType= closeM.getTargetType();
try { switch (targetType) {
case JCXBLOCK:
if (!(lastTag instanceof JcxBlockMarker))
throw new Exception();
break;
case JCXSPAN:
if (!(lastTag instanceof JcxSpanMarker))
throw new Exception();
break;
case BLOCK:
if (!(lastTag instanceof BlockMarker))
throw new Exception();
break;
case INLINE:
if (!(lastTag instanceof InlineMarker))
throw new Exception();
break;
default:
throw new IllegalStateException(
"Unexpected target tag type: " + targetType);
} } catch (Exception e) {
throw new CreoleParseException(
"Tangled tag nesting. No matching open "
+ targetType + " tag for close of "
+ closeM + ". Last open tag is "
+ lastTag + '.', e);
}
if (lastTag.isAtomic())
throw new CreoleParseException(
"Close tag " + closeM
+ " attempted to close atomic tag "
+ lastTag + '.');
// Get this validation over with so rest of this block can
// assume lastTag is an instance of one of these types.
if (!(lastTag instanceof JcxSpanMarker)
&& !(lastTag instanceof JcxBlockMarker)
&& !(lastTag instanceof BlockMarker)
&& !(lastTag instanceof InlineMarker))
throw new RuntimeException(
"Unexpected class for TagMarker " + lastTag
+ ": " + lastTag.getClass().getName());
// At this point we have validated match with an opening tag.
if (lastTag instanceof JcxSpanMarker) {
prevJcxSpan = (JcxSpanMarker) lastTag;
typedStack = jcxSpanStack;
} else if (lastTag instanceof JcxBlockMarker) {
prevJcxBlock = (JcxBlockMarker) lastTag;
typedStack = jcxBlockStack;
} else if (lastTag instanceof BlockMarker) {
prevBlock = (BlockMarker) lastTag;
typedStack = blockStack;
} else if (lastTag instanceof InlineMarker) {
prevInline = (InlineMarker) lastTag;
typedStack = inlineStack;
}
if (typedStack.size() < 1 || typedStack.get(0) != lastTag)
throw new CreoleParseException(
"Closing tag " + lastTag
+ ", but it is not on the tail of the "
+ "type-specific tag stack: " + typedStack);
typedStack.remove(0);
stack.remove(0);
} else if (m instanceof Styler) {
Styler styler = (Styler) m;
TagType targetType = styler.getTargetType();
String[] classNames = styler.getClassNames();
// Get this validation over with so rest of this block can
// assume targetType is an instance of one of these types.
switch (targetType) {
case INLINE: