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