javax.swing.text.html.parser
public final class: ContentModel [javadoc |
source]
java.lang.Object
javax.swing.text.html.parser.ContentModel
All Implemented Interfaces:
Serializable
A representation of a content model. A content model is
basically a restricted BNF expression. It is restricted in
the sense that it must be deterministic. This means that you
don't have to represent it as a finite state automata.
See Annex H on page 556 of the SGML handbook for more information.
- author:
Arthur - van Hoff
| Field Summary |
|---|
| public int | type | Type. Either '*', '?', '+', ',', '|', '&'. |
| public Object | content | The content. Either an Element or a ContentModel. |
| public ContentModel | next | The next content model (in a ',', '|' or '&' expression). |
| Methods from java.lang.Object: |
|---|
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Method from javax.swing.text.html.parser.ContentModel Detail: |
public boolean empty() {
switch (type) {
case '*":
case '?":
return true;
case '+":
case '|":
for (ContentModel m = (ContentModel)content ; m != null ; m = m.next) {
if (m.empty()) {
return true;
}
}
return false;
case ',":
case '&":
for (ContentModel m = (ContentModel)content ; m != null ; m = m.next) {
if (!m.empty()) {
return false;
}
}
return true;
default:
return false;
}
}
Return true if the content model could
match an empty input stream. |
public Element first() {
switch (type) {
case '&":
case '|":
case '*":
case '?":
return null;
case '+":
case ',":
return ((ContentModel)content).first();
default:
return (Element)content;
}
}
Return the element that must be next. |
public boolean first(Object token) {
switch (type) {
case '*":
case '?":
case '+":
return ((ContentModel)content).first(token);
case ',":
for (ContentModel m = (ContentModel)content ; m != null ; m = m.next) {
if (m.first(token)) {
return true;
}
if (!m.empty()) {
return false;
}
}
return false;
case '|":
case '&": {
Element e = (Element) token;
if (valSet == null) {
valSet = new boolean[Element.maxIndex + 1];
val = new boolean[Element.maxIndex + 1];
// All Element instances are created before this ever executes
}
if (valSet[e.index]) {
return val[e.index];
}
for (ContentModel m = (ContentModel)content ; m != null ; m = m.next) {
if (m.first(token)) {
val[e.index] = true;
break;
}
}
valSet[e.index] = true;
return val[e.index];
}
default:
return (content == token);
// PENDING: refer to comment in ContentModelState
/*
if (content == token) {
return true;
}
Element e = (Element)content;
if (e.omitStart() && e.content != null) {
return e.content.first(token);
}
return false;
*/
}
}
Return true if the token could potentially be the
first token in the input stream. |
public void getElements(Vector elemVec) {
switch (type) {
case '*":
case '?":
case '+":
((ContentModel)content).getElements(elemVec);
break;
case ',":
case '|":
case '&":
for (ContentModel m=(ContentModel)content; m != null; m=m.next){
m.getElements(elemVec);
}
break;
default:
elemVec.addElement((Element)content);
}
}
Update elemVec with the list of elements that are
part of the this contentModel. |
public String toString() {
switch (type) {
case '*":
return content + "*";
case '?":
return content + "?";
case '+":
return content + "+";
case ',":
case '|":
case '&":
char data[] = {' ", (char)type, ' "};
String str = "";
for (ContentModel m = (ContentModel)content ; m != null ; m = m.next) {
str = str + m;
if (m.next != null) {
str += new String(data);
}
}
return "(" + str + ")";
default:
return content.toString();
}
}
|