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 * <? ... ?><br/> 014 * e.x.<br/> 015 * <?xml version="1.0" encoding="UTF-8"?><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 }