public BasicNode (Token token) { if (token == null) throw new NullPointerException ("token is null"); this.token = token; this.type = token.getType(); }
protected Token parseAttListNameTokens (XMLTokenizer tokenizer, Token token, DocTypeAttributeList attList) { while ((token = tokenizer.next ()) != null) { attList.addNode (toNode (token)); if (token.getType () == Type.DTD_WHITESPACE || token.getType () == Type.TEXT || token.getType () == Type.DOCTYPE_ALTERNATIVE ) continue; if (token.getType () == Type.DOCTYPE_END_GROUP) break; throw new XMLParseException ("Expected whitespace, '|' or a name token", token); } return token; }
@Override public String toString () { return "Token (" + getType () + ", " + getStartOffset () + ":" + getEndOffset () + ", " + getEscapedText () + ")"; }
/** * Fetch the next token and make sure it's one of {@code expected}. If not, create an * {@link XMLParseException} using the {@code errorMessage} */ protected Token expect (XMLTokenizer tokenizer, Token startToken, Type[] expected, String errorMessage) { Token token = tokenizer.next (); //System.out.println (token); boolean valid = token != null; if (valid) { valid = false; for (Type t: expected) { if (token.getType () == t) { valid = true; break; } } } if (!valid) { if (token == null) token = startToken; throw new XMLParseException (errorMessage + ": " + token, token); } return token; }
protected Token skipWhiteSpaceAndComments (XMLTokenizer tokenizer, Token token, DocTypeNode n) { while (token != null) { if (token.getType () == Type.DTD_WHITESPACE) { n.addNode (toNode (token)); token = tokenizer.next (); } else if (token.getType () == Type.DOCTYPE_COMMENT) { n.addNode (toNode (token)); token = tokenizer.next (); } else break; } return token; }
/** * Fetch the next token and make sure it's {@code expected}. If not, create an * {@link XMLParseException} using the {@code errorMessage} */ protected Token expect (XMLTokenizer tokenizer, Token startToken, Type expected, String errorMessage) { Token token = tokenizer.next (); //System.out.println (token); if (token == null || token.getType () != expected) { if (token == null) token = startToken; throw new XMLParseException (errorMessage + tokenizer.lookAheadForErrorMessage ("but found", token.getStartOffset (), 20) + " (" + token + ")", token); } return token; }
protected Token parseAttListTypeGroup (XMLTokenizer tokenizer, Token token, DocTypeAttributeList attList) { attList.addNode (toNode (token)); Token startGroup = token; int subLevel = 0; while ((token = tokenizer.next ()) != null) { attList.addNode (toNode (token)); if (token.getType () == Type.DOCTYPE_END_GROUP) { if (subLevel == 0) break; subLevel --; } else if (token.getType () == Type.DOCTYPE_BEGIN_GROUP) { subLevel ++; } } if (token == null) throw new XMLParseException ("Expected end of group"+tokenizer.lookAheadForErrorMessage ("but found", startGroup.getStartOffset (), 20), startGroup); return token; }
if (startToken == null) throw new XMLParseException ("Expected '<!DOCTYPE'", tokenizer.getSource (), tokenizer.getOffset ()); if (startToken.getType () != Type.DOCTYPE) throw new XMLParseException ("Expected '<!DOCTYPE' but found '"+startToken.getText ()+"'", startToken); if (token.getType () == Type.DOCTYPE_SYSTEM) else if (token.getType () == Type.DOCTYPE_PUBLIC) else if (token.getType () == Type.DOCTYPE_NDATA) if (token.getType () == Type.DOCTYPE_BEGIN_SUBSET) if (token.getType () != Type.DOCTYPE_END) throw new XMLParseException ("Expected '>', got "+token, token);
if (token.getType() == Type.DOCTYPE_END) break; if (token.getType () != Type.TEXT) throw new XMLParseException ("Expected attribute name", token); attList.addNode (toNode (token)); if (token.getType () == Type.TEXT) break; if (token.getType () == Type.DOCTYPE_BEGIN_GROUP) break; if (token.getType () != Type.DOCTYPE_IMPLIED && token.getType () != Type.DOCTYPE_REQUIRED && token.getType () != Type.DOCTYPE_FIXED && token.getType () != Type.DOCTYPE_QUOTED_TEXT if (token.getType () == Type.DOCTYPE_FIXED)
/** * If the next token is whitespace, skip it. * * @param tokenizer * @param startToken This might be whitespace * @param docType * @return The current or the next token. */ protected Token skipOptionalWhitespace (XMLTokenizer tokenizer, Token startToken, DocType docType) { if (startToken == null) throw new XMLParseException ("Unexpected EOF after '<!DOCTYPE'", tokenizer.getSource (), tokenizer.getSource ().length ()); Token token = startToken; if (token.getType () == Type.DTD_WHITESPACE) { docType.add (toNode (token)); token = tokenizer.next (); if (token == null) throw new XMLParseException ("Unexpected EOF after '<!DOCTYPE'", startToken); } return token; }
if (token == null || token.getType() == Type.BEGIN_ELEMENT_END) break; if (token.getType() != Type.ATTRIBUTE) throw new XMLParseException ("Unexpected token "+token+" while parsing attributes of element "+parent.getName (), token); //@COBEX throw new XMLParseException ("Unexpected end-of-file while parsing attributes of element "+parent.getName (), tokenizer.getSource (), tokenizer.getOffset ()); if (token.getType() == Type.BEGIN_ELEMENT_END)
switch (token.getType()) //@COBEX
if (token.getType () == Type.DOCTYPE_SYSTEM) token = skipWhiteSpaceAndComments (tokenizer, tokenizer.next (), notation); else if (token.getType () == Type.DOCTYPE_PUBLIC) && token.getType () != Type.DOCTYPE_END if (token.getType () != Type.DTD_WHITESPACE) throw new XMLParseException ("Expected whitespace after public ID literal", token); if (token.getType () != Type.DOCTYPE_END) throw new XMLParseException ("Expected '>' after notation declaration"+tokenizer.lookAheadForErrorMessage ("but found", token.getStartOffset (), 20), tokenizer.getSource (), tokenizer.getOffset ());
protected void parseDocTypeSubElement (XMLTokenizer tokenizer, Token startToken, DocType docType) { Token token = startToken; token = expect (tokenizer, token, Type.DTD_WHITESPACE, "Expected whitespace after '<!ELEMENT'"); token = expect (tokenizer, token, Type.TEXT, "Expected element name"); String name = token.getText (); token = expect (tokenizer, token, Type.DTD_WHITESPACE, "Expected whitespace after element name"); Token beforeContent = token; while ((token = tokenizer.next ()) != null) { //System.out.println ("parseDocTypeSubElement "+token); if (token.getType() == Type.DOCTYPE_END) break; // TODO Check EMPTY, ANY, #PCDATA, (|), ?, *, + } if (token == null) throw new XMLParseException ("Unexpected EOF while parsing element content", tokenizer.getSource (), tokenizer.getOffset ()); String content = tokenizer.getSource ().substring (beforeContent.getEndOffset (), token.getStartOffset ()); startToken.setEndOffset (token.getEndOffset ()); DocTypeElement element = new DocTypeElement (startToken, name, content); docType.add (element); }
if (token.getType () == Type.DOCTYPE_SYSTEM) else if (token.getType () == Type.DOCTYPE_PUBLIC) throw new XMLParseException ("Unexpected EOF while parsing entity declaration", tokenizer.getSource (), tokenizer.getOffset ()); if (token.getType () == Type.DOCTYPE_NDATA) if (token.getType () != Type.DOCTYPE_END) throw new XMLParseException ("Expected '>' after entity declaration"+tokenizer.lookAheadForErrorMessage ("but found", token.getStartOffset (), 20), tokenizer.getSource (), tokenizer.getOffset ());
pos ++; parseDocTypeMarkupDeclaration (token); if (token.getType () != Type.DOCTYPE) docTypeLevel ++; break;