* Contributors:
* Igor Malinin - initial contribution
*
- * $Id: XMLPartitionScanner.java,v 1.1 2004-09-02 18:28:03 jsurfer Exp $
+ * $Id: XMLPartitionScanner.java,v 1.5 2006-10-21 23:14:13 pombredanne Exp $
*/
package net.sourceforge.phpeclipse.xml.ui.internal.text;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
-
/**
*
*
* @author Igor Malinin
*/
public class XMLPartitionScanner implements IPartitionTokenScanner {
- public static final String XML_PI = "__xml_processing_instruction";
- public static final String XML_COMMENT = "__xml_comment";
- public static final String XML_DECL = "__xml_declaration";
- public static final String XML_TAG = "__xml_tag";
- public static final String XML_ATTRIBUTE = "__xml_attribute";
- public static final String XML_CDATA = "__xml_cdata";
-
- public static final String DTD_INTERNAL = "__dtd_internal";
- public static final String DTD_INTERNAL_PI = "__dtd_internal_pi";
+ public static final String XML_PI = "__xml_processing_instruction";
+
+ public static final String XML_COMMENT = "__xml_comment";
+
+ public static final String XML_DECL = "__xml_declaration";
+
+ public static final String XML_TAG = "__xml_tag";
+
+ public static final String XML_ATTRIBUTE = "__xml_attribute";
+
+ public static final String XML_CDATA = "__xml_cdata";
+
+ public static final String DTD_INTERNAL = "__dtd_internal";
+
+ public static final String DTD_INTERNAL_PI = "__dtd_internal_pi";
+
public static final String DTD_INTERNAL_COMMENT = "__dtd_internal_comment";
- public static final String DTD_INTERNAL_DECL = "__dtd_internal_declaration";
- public static final String DTD_CONDITIONAL = "__dtd_conditional";
- public static final int STATE_DEFAULT = 0;
- public static final int STATE_TAG = 1;
- public static final int STATE_DECL = 2;
- public static final int STATE_CDATA = 4;
+ public static final String DTD_INTERNAL_DECL = "__dtd_internal_declaration";
+
+ public static final String DTD_CONDITIONAL = "__dtd_conditional";
+
+ public static final int STATE_DEFAULT = 0;
+
+ public static final int STATE_TAG = 1;
+
+ public static final int STATE_DECL = 2;
- public static final int STATE_INTERNAL = 8;
+ public static final int STATE_CDATA = 4;
+
+ public static final int STATE_INTERNAL = 8;
protected IDocument document;
+
protected int end;
protected int offset;
+
protected int length;
protected int position;
+
protected int state;
protected boolean parsedtd;
offset += length;
switch (state) {
- case STATE_TAG:
- return nextTagToken();
+ case STATE_TAG:
+ return nextTagToken();
- case STATE_DECL:
- return nextDeclToken();
+ case STATE_DECL:
+ return nextDeclToken();
- case STATE_CDATA:
- return nextCDATAToken();
+ case STATE_CDATA:
+ return nextCDATAToken();
}
switch (read()) {
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(null);
+
+ case '<':
+ switch (read()) {
case ICharacterScanner.EOF:
+ if (parsedtd || isInternal()) {
+ break;
+ }
+
state = STATE_DEFAULT;
- return getToken(null);
+ return getToken(XML_TAG);
- case '<':
+ case '?': // <? <?PI
+ return nextPIToken();
+
+ case '!': // <! <!DEFINITION or <![CDATA[ or <!--COMMENT
switch (read()) {
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(XML_TAG);
+
+ case '-': // <!- <!--COMMENT
+ switch (read()) {
case ICharacterScanner.EOF:
- if (parsedtd || isInternal()) {
- break;
- }
+ return nextDeclToken();
- state = STATE_DEFAULT;
- return getToken(XML_TAG);
-
- case '?': // <? <?PI
- return nextPIToken();
-
- case '!': // <! <!DEFINITION or <![CDATA[ or <!--COMMENT
- switch (read()) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(XML_TAG);
-
- case '-': // <!- <!--COMMENT
- switch (read()) {
- case ICharacterScanner.EOF:
- return nextDeclToken();
-
- case '-': // <!--
- return nextCommentToken();
- }
-
- case '[': // <![ <![CDATA[ or <![%cond;[
- if (parsedtd) {
- return nextConditionalToken();
- }
-
- if (!isInternal()) {
- return nextCDATAToken();
- }
- }
+ case '-': // <!--
+ return nextCommentToken();
+ }
- return nextDeclToken();
- }
+ case '[': // <![ <![CDATA[ or <![%cond;[
+ if (parsedtd) {
+ return nextConditionalToken();
+ }
- if (parsedtd || isInternal()) {
- break;
+ if (!isInternal()) {
+ return nextCDATAToken();
+ }
}
- unread();
+ return nextDeclToken();
+ }
- return nextTagToken();
+ if (parsedtd || isInternal()) {
+ break;
+ }
- case ']':
- if (isInternal()) {
- unread();
+ unread();
- state = STATE_DECL;
- length = 0;
- return nextToken();
- }
+ return nextTagToken();
+
+ case ']':
+ if (isInternal()) {
+ unread();
+
+ state = STATE_DECL;
+ length = 0;
+ return nextToken();
+ }
+ break;
+ default:
+ unread();
}
-loop:
- while (true) {
+ loop: while (true) {
switch (read()) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(null);
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(null);
- case '<':
- if (parsedtd || isInternal()) {
- switch (read()) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(null);
-
- case '!':
- case '?':
- unread();
- break;
-
- default:
- continue loop;
- }
- }
+ case '<':
+ if (parsedtd || isInternal()) {
+ switch (read()) {
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(null);
- unread();
+ case '!':
+ case '?':
+ unread();
+ break;
- state &= STATE_INTERNAL;
- return getToken(isInternal() ? DTD_INTERNAL : null);
+ default:
+ continue loop;
+ }
+ }
- case ']':
- if (isInternal()) {
- unread();
+ unread();
- state = STATE_DECL;
- if (position == offset) {
- // nothing between
- length = 0;
- return nextToken();
- }
+ state &= STATE_INTERNAL;
+ return getToken(isInternal() ? DTD_INTERNAL : null);
+
+ case ']':
+ if (isInternal()) {
+ unread();
- return getToken(DTD_INTERNAL);
+ state = STATE_DECL;
+ if (position == offset) {
+ // nothing between
+ length = 0;
+ return nextToken();
}
+
+ return getToken(DTD_INTERNAL);
+ }
}
}
}
int quot = read();
switch (quot) {
- case ICharacterScanner.EOF:
- case '>':
- state = STATE_DEFAULT;
- return getToken(XML_TAG);
+ case ICharacterScanner.EOF:
+ case '>':
+ state = STATE_DEFAULT;
+ return getToken(XML_TAG);
- case '"': case '\'':
- while (true) {
- int ch = read();
+ case '"':
+ case '\'':
+ while (true) {
+ int ch = read();
- if (ch == quot) {
- state = STATE_TAG;
- return getToken(XML_ATTRIBUTE);
- }
+ if (ch == quot) {
+ state = STATE_TAG;
+ return getToken(XML_ATTRIBUTE);
+ }
- switch (ch) {
- case '<':
- unread();
+ switch (ch) {
+ case '<':
+ unread();
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(XML_ATTRIBUTE);
- }
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(XML_ATTRIBUTE);
}
+ }
+ default:
+ unread();
}
while (true) {
switch (read()) {
- case '<':
- unread();
+ case '<':
+ unread();
- case ICharacterScanner.EOF:
- case '>':
- state = STATE_DEFAULT;
- return getToken(XML_TAG);
+ case ICharacterScanner.EOF:
+ case '>':
+ state = STATE_DEFAULT;
+ return getToken(XML_TAG);
- case '"': case '\'':
- unread();
+ case '"':
+ case '\'':
+ unread();
- state = STATE_TAG;
- return getToken(XML_TAG);
+ state = STATE_TAG;
+ return getToken(XML_TAG);
}
}
}
private IToken nextDeclToken() {
loop: while (true) {
switch (read()) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(isInternal() ? DTD_INTERNAL_DECL : XML_DECL);
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(isInternal() ? DTD_INTERNAL_DECL : XML_DECL);
- case '<':
- if (parsedtd || isInternal()) {
- switch (read()) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(isInternal() ? DTD_INTERNAL : null);
-
- case '!':
- case '?':
- unread();
- break;
-
- default:
- continue loop;
- }
+ case '<':
+ if (parsedtd || isInternal()) {
+ switch (read()) {
+ case ICharacterScanner.EOF:
+ state = STATE_DEFAULT;
+ return getToken(isInternal() ? DTD_INTERNAL : null);
+
+ case '!':
+ case '?':
+ unread();
+ break;
+
+ default:
+ continue loop;
}
+ }
- unread();
+ unread();
- case '>':
- state &= STATE_INTERNAL;
- return getToken(isInternal() ? DTD_INTERNAL_DECL : XML_DECL);
+ case '>':
+ state &= STATE_INTERNAL;
+ return getToken(isInternal() ? DTD_INTERNAL_DECL : XML_DECL);
- case '[': // <!DOCTYPE xxx [dtd]>
- if (!isInternal()) {
- state = STATE_INTERNAL;
- return getToken(XML_DECL);
- }
+ case '[': // <!DOCTYPE xxx [dtd]>
+ if (!isInternal()) {
+ state = STATE_INTERNAL;
+ return getToken(XML_DECL);
+ }
}
}
}
loop: while (true) {
switch (read()) {
+ case ICharacterScanner.EOF:
+ break loop;
+
+ case '-': // - -->
+ switch (read()) {
case ICharacterScanner.EOF:
break loop;
- case '-': // - -->
+ case '-': // -- -->
switch (read()) {
- case ICharacterScanner.EOF:
- break loop;
-
- case '-': // -- -->
- switch (read()) {
- case ICharacterScanner.EOF:
- case '>':
- break loop;
- }
-
- unread();
- break loop;
+ case ICharacterScanner.EOF:
+ case '>':
+ break loop;
}
+
+ unread();
+ continue loop;
+ }
}
}
loop: while (true) {
switch (read()) {
+ case ICharacterScanner.EOF:
+ break loop;
+
+ case '?': // ? ?>
+ switch (read()) {
case ICharacterScanner.EOF:
+ case '>':
break loop;
+ }
- case '?': // ? ?>
- switch (read()) {
- case ICharacterScanner.EOF:
- case '>':
- break loop;
- }
-
- unread();
+ unread();
}
}
private IToken nextCDATAToken() {
state = STATE_DEFAULT;
-loop:
- while (true) {
+ loop: while (true) {
switch (read()) {
+ case ICharacterScanner.EOF:
+ break loop;
+
+ case ']': // ] ]]>
+ switch (read()) {
case ICharacterScanner.EOF:
break loop;
- case ']': // ] ]]>
+ case ']': // ]] ]]>
switch (read()) {
- case ICharacterScanner.EOF:
- break loop;
-
- case ']': // ]] ]]>
- switch (read()) {
- case ICharacterScanner.EOF:
- case '>': // ]]>
- break loop;
- }
-
- unread();
- unread();
- continue loop;
+ case ICharacterScanner.EOF:
+ case '>': // ]]>
+ break loop;
}
+
+ unread();
+ unread();
+ continue loop;
+ }
}
}
int level = 1;
-loop:
- while (true) {
+ loop: while (true) {
switch (read()) {
+ case ICharacterScanner.EOF:
+ break loop;
+
+ case '<': // - -->
+ switch (read()) {
case ICharacterScanner.EOF:
break loop;
- case '<': // - -->
+ case '!': // -- -->
switch (read()) {
- case ICharacterScanner.EOF:
- break loop;
-
- case '!': // -- -->
- switch (read()) {
- case ICharacterScanner.EOF:
- break loop;
-
- case '[':
- ++level;
- continue loop;
- }
+ case ICharacterScanner.EOF:
+ break loop;
- unread();
- continue loop;
+ case '[':
+ ++level;
+ continue loop;
}
unread();
continue loop;
+ }
- case ']': // - -->
- switch (read()) {
- case ICharacterScanner.EOF:
- break loop;
+ unread();
+ continue loop;
- case ']': // -- -->
- switch (read()) {
- case ICharacterScanner.EOF:
- case '>':
- if (--level == 0) {
- break loop;
- }
+ case ']': // - -->
+ switch (read()) {
+ case ICharacterScanner.EOF:
+ break loop;
- continue loop;
- }
+ case ']': // -- -->
+ switch (read()) {
+ case ICharacterScanner.EOF:
+ case '>':
+ if (--level == 0) {
+ break loop;
+ }
- unread();
- unread();
- continue loop;
+ continue loop;
}
+
+ unread();
+ unread();
+ continue loop;
+ }
}
}
* @see org.eclipse.jface.text.rules.ITokenScanner#getTokenOffset()
*/
public int getTokenOffset() {
- Assert.isTrue(offset>=0, Integer.toString(offset));
+ Assert.isTrue(offset >= 0, Integer.toString(offset));
return offset;
}
}
/*
- * @see org.eclipse.jface.text.rules.ITokenScanner#setRange(IDocument, int, int)
+ * @see org.eclipse.jface.text.rules.ITokenScanner#setRange(IDocument, int,
+ * int)
*/
public void setRange(IDocument document, int offset, int length) {
this.document = document;
/*
* @see org.eclipse.jface.text.rules.IPartitionTokenScanner
*/
- public void setPartialRange(
- IDocument document, int offset, int length,
- String contentType, int partitionOffset
- ) {
+ // public void setPartialRange(IDocument document, int offset, int length,
+ // String contentType, int partitionOffset) {
+ // state = STATE_DEFAULT;
+ // if (partitionOffset > -1) {
+ // int delta = offset - partitionOffset;
+ // if (delta > 0) {
+ // setRange(document, partitionOffset, length + delta);
+ // return;
+ // }
+ // }
+ // setRange(document, partitionOffset, length);
+ // }
+ /*
+ * @see org.eclipse.jface.text.rules.IPartitionTokenScanner
+ */
+ public void setPartialRange(IDocument document, int offset, int length,
+ String contentType, int partitionOffset) {
+ // boolean flag = false;
this.document = document;
this.end = offset + length;
// NB! Undocumented value: -1
if (partitionOffset >= 0) {
offset = partitionOffset;
+ // flag = true;
}
this.offset = offset;
this.position = offset;
this.length = 0;
+ // if (flag) {
+ // state = STATE_DEFAULT;
+ // return;
+ // }
if (contentType == XML_ATTRIBUTE) {
state = STATE_TAG;
return;
return;
}
- if (contentType == DTD_INTERNAL ||
- contentType == DTD_INTERNAL_PI ||
- contentType == DTD_INTERNAL_DECL ||
- contentType == DTD_INTERNAL_COMMENT
- ) {
+ if (contentType == DTD_INTERNAL || contentType == DTD_INTERNAL_PI
+ || contentType == DTD_INTERNAL_DECL
+ || contentType == DTD_INTERNAL_COMMENT) {
state = STATE_INTERNAL;
return;
}
if (type != IDocument.DEFAULT_CONTENT_TYPE) {
return true;
}
- } catch (BadLocationException e) {}
+ } catch (BadLocationException e) {
+ }
return false;
}