/*
* Created on 2004/10/24
* Author aki@www.xucker.jpn.org
* License Apache2.0 or Common Public License
*/
package com.akjava.lib.common.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*
*/
public class TagUtil {
public static String removeLineSeparator(String tag){
tag=tag.replace("\n", "");
tag=tag.replace("\r", "");
return tag;
}
public static String getName(String text){
String result=null;
if(text.charAt(0)=='<'){
int find=text.indexOf(" ");
if(find!=-1){
String tagName=text.substring(1,find);
return tagName;
}else{
int gt=text.indexOf(">");
if(gt!=-1){
String tagName=text.substring(1,gt);
if(tagName.endsWith("/")){
return text.substring(1,gt-1); //case <tag/>
}else{
return tagName;
}
}
return null;
}
}
return result;
}
public static String getAnother(String text){
String result=null;
if(text.charAt(0)=='<'){
int find=text.indexOf(" ");
if(find!=-1){
int end=text.indexOf(">",find);
if(end!=-1){
String another=text.substring(find+1,end);
if(another.endsWith("/")){
return another.substring(0,another.length()-1);
}else{
return another;
}
}else{
return null;
}
}else{
return null;
}
}
return result;
}
public static String getTag(String text){
String result=null;
if(text.charAt(0)=='<'){
int maxSpaceAt=text.indexOf(">");
if(maxSpaceAt==-1){
return null;
}
int find=text.indexOf(" ");
if(find!=-1 && find<maxSpaceAt){
String tagName=text.substring(1,find);
int last=text.indexOf(tagName+"/>");
if(last!=-1){
result=text.substring(0,tagName.length()+last+2);
return result;
}
last=text.indexOf("</"+tagName+">");
if(last!=-1){
return text.substring(0,tagName.length()+last+3);
}
last=text.indexOf("/>");
if(last!=-1){
result=text.substring(0,last+2);
return result;
}
}else{
int gt=text.indexOf(">");
if(gt!=-1){
String tagName=text.substring(1,gt);
if(tagName.endsWith("/")){
return text.substring(0,gt+1); //case <tag/>
}else{
String endTag="</"+tagName+">";
int endMutch=text.indexOf(endTag,gt);
if(endMutch!=-1){
return text.substring(0,endMutch+endTag.length());
}
}
}
return null;
}
}
return result;
}
public static List<String> getTagByName(String text,String name){
//not support />
List<String> list=new ArrayList<String>();
int index=text.toLowerCase().indexOf("<"+name.toLowerCase());
while(index!=-1){
text=text.substring(index);
String tag=getTag(text);
list.add(tag);
text=text.substring(tag.length());
index=text.toLowerCase().indexOf("<"+name.toLowerCase());
}
/*
int start=0;
while(true){
int index=text.toLowerCase().indexOf("<"+name.toLowerCase(),start);
if(index==-1){
break;
}else{
int end=text.toLowerCase().indexOf("</"+name.toLowerCase()+">",start+name.length()+2);
if(end!=-1){
// System.out.println("text:"+text.substring(index,end+name.length()+3));
list.add(text.substring(index,end+name.length()+3));
start=end+name.length()+3;
}
}
}
*/
return list;
}
public static String getContain(String tag){
if(tag.startsWith("<")){
int index=tag.indexOf(">");
if(index!=-1){
int last=tag.indexOf("<",index);
if(last!=-1){
return tag.substring(index+1,last);
}
}
return null;
}else{
return null;
}
}
/*
public static int pmode=0;
public static Map<String,String> getAttribute(String tag){
Map<String,String> map=new HashMap<String,String>();
String another=getAnother(tag);
String[] ps=another.split("\\s+");
String key;
String value;
for(String v:ps){
if(!v.isEmpty()){
}
}
return map;
}
private static boolean typeEquals(String t){
return t.equals("=");
}
*/
public static int SINGLE_QUOTE=3;
public static int QUOTE=1;
public static int KEY=0;
public static int VALUE=2;
//BUGS cant get multiply single value
public static Map<String,String> getAttribute(String tag){
Map<String,String> map=new HashMap<String,String>();
if(tag.startsWith("<")){
int start=tag.indexOf(" ");
if(start==-1)
return map;
int end=tag.indexOf(">",start+1);
if(end==-1)
return map;
String atrs=tag.substring(start+1,end);
int mode=KEY;
String quote=null;
String key="";
String value="";
for(int i=0;i<atrs.length();i++){
if(mode==KEY){
if(isWhitespace(atrs.charAt(i))){
}else{
if(atrs.charAt(i)=='='){
mode=QUOTE;
}else{
if( atrs.charAt(i)=='/'){
break;
}
key+=atrs.charAt(i);
}
}
}else if(mode==QUOTE){
if(isWhitespace(atrs.charAt(i))){
}else{
if(atrs.charAt(i)=='\''){
quote="'";
mode=VALUE;
}else if(atrs.charAt(i)=='"'){
quote="\"";
mode=VALUE;
}else{
quote="";
mode=VALUE;
value+=atrs.charAt(i);
}
}
}else if(mode==VALUE){
if(quote.equals(""+atrs.charAt(i))){
map.put(key,value);
key="";
value="";
mode=KEY;
}else{
if(quote.equals("") && (isWhitespace(atrs.charAt(i)) || atrs.charAt(i)=='/')){
map.put(key,value);
key="";
value="";
mode=KEY;
}else{
value+=atrs.charAt(i);
}
}
}
}
if(value.length()>0){
if(key.length()>0){
map.put(key,value);
}
}else if(key.length()>0){
map.put(key,"true");
}
return map;
}else{
return map;
}
}
public static boolean isWhitespace(char ch){
if(ch=='\t'){
return true;
}
if(ch==' '){
return true;
}
if(ch=='\r'){
return true;
}
if(ch=='\n'){
return true;
}
return false;
}
}