/* * 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; } }