001 /*
002 * To change this template, choose Tools | Templates
003 * and open the template in the editor.
004 */
005
006 package org.util.xml.parse;
007
008 import java.io.IOException;
009 import org.util.xml.element.TextElement;
010
011 /**
012 *
013 * <div>
014 * <? ... ?><br/>
015 * e.x.<br/>
016 * <?xml version="1.0" encoding="UTF-8"?><br/>
017 * </div>
018 * @author masaru
019 */
020 public class CommentInnerTagElementParser extends ParseElement {
021
022 private int cc,ccc;
023 private String return_value_;
024 private TextElement text_element_;
025
026 public CommentInnerTagElementParser() {
027
028 }
029
030 @Override
031 public boolean match(char c) {
032 return c=='!';
033 }
034
035 @Override
036 public int parse(int c, ElementParser parser) throws XMLParseException, IOException {
037 int type = -1;
038 StringBuffer sb = new StringBuffer();
039 if(c!='!') throw new XMLParseException("parse error: cannot read comment tag");
040 c=parser.get();
041 cc=-1;
042 ccc=-1;
043 for(int state = 0;;) {
044
045 if(state == 0) {
046 sb.append((char)c);
047 if(c == '-') state = 3;
048 else if(c == '[') state = 2;
049 else state = 1;
050 } else if(state == 1) {
051 if(c=='[') {
052 state = 6;
053 sb.append((char)c);
054 } else if(c=='>') {
055 type = 0;
056 break;
057 } else {
058 sb.append((char)c);
059 }
060 } else if(state == 2) {
061 sb.append((char)c);
062 String cdata = "CDATA[";
063 boolean match = true;
064 for(int i=0; i<cdata.length()&&match;i++) {
065 if(i!=0)
066 c = parser.get();
067 sb.append((char)c);
068 match = (cdata.charAt(i)==c);
069 }
070 if(match) {
071 sb = new StringBuffer();
072 state = 5;
073 } else state = 1;
074 } else if(state == 3) {
075 if(c=='-') {
076 sb = new StringBuffer();
077 state = 4;
078 } else {
079 sb.append((char)c);
080 state = 1;
081 }
082 } else if(state == 4) {
083 if(ccc=='-' && cc=='-' && c=='>') {
084 type = 1;
085 break;
086 } else if(ccc != -1) sb.append((char)ccc);
087 ccc = cc;
088 cc = c;
089 } else if(state == 5) {
090 if(ccc==']' && cc==']' && c=='>') {
091 type = 2;
092 break;
093 } else if(ccc != -1) sb.append((char)ccc);
094 ccc = cc;
095 cc = c;
096 } else if(state == 6) {
097 if(c==']') {
098 sb.append((char)c);
099 state = 1;
100 } else
101 sb.append((char)c);
102 }
103 c=parser.getChar();
104 }
105 return_value_ = sb.toString();
106 text_element_ = new TextElement(return_value_);
107 if(type==0) text_element_.setTag(true);
108 else if(type==1) text_element_.setCommenTag(true);
109 else if(type==2) text_element_.setCDATATag(true);
110
111 return parser.get();
112 }
113
114 public TextElement getResult() {
115 return text_element_;
116 }
117
118 @Override
119 public String getReturnValue() {
120 return return_value_;
121 }
122 }