package folioxml.xml; import folioxml.core.InvalidMarkupException; import folioxml.core.TokenBase; public class XmlToken extends TokenBase<XmlToken> { protected XmlToken() { } public XmlToken(String text) throws InvalidMarkupException { this.markup = text; this.reparse(); } public XmlToken(TokenType type, String text) throws InvalidMarkupException { this.type = type; this.markup = text; if (this.type == TokenType.Tag) parseTag(); } protected XmlToken(XmlToken base, boolean deepCopyAttrs) { base.copyTo(this, deepCopyAttrs); } public boolean inXmlTokenMode() { return true; } /** * Creates a deep copy of the token, minus the ghostPair value. */ public XmlToken clone() { return new XmlToken(this, true); } public XmlToken clone(boolean deepCopyAttrs) { return new XmlToken(this, deepCopyAttrs); } /** * Returns an XML-compliant closing tag (no isGhost, sourceToken, startsNewContext, or attrs. * Throws an exception if this token is not an opening tag. * * @return * @throws InvalidMarkupException */ public XmlToken getClosingTag() throws InvalidMarkupException { if (!(this.isOpening() && this.isTag()) || this.getTagName() == null) throw new InvalidMarkupException("getClosingTag() can only be called on opening tag tokens with non-null tag names.", this); XmlToken t = new XmlToken(); t.markup = "</" + this.getTagName() + ">"; t.type = TokenType.Tag; t.setTagName(this.getTagName(), false); t.tagType = TagType.Closing; return t; } }