

import java.io.*;





public class BookmarkParser {


 public static final int EOF         = -1;
 public static final int UNKNOWN     =  0;
 public static final int BOOKMARK    =  1;
 public static final int FOLDER      =  2;
 public static final int FOLDER_END  =  3;
 public static final int SEPARATOR   =  4;


 int         type = UNKNOWN;
 TagGetter   t;
 String      name, link;




 public BookmarkParser(Reader r)
         throws IOException
 {
     t = new TagGetter(r);
 }


 public int    getType(){        return type;   }
 public String getName(){        return name;   }
 public String getLink(){        return link;   }




 public int next() throws IOException{
     String s = t.next();

  if( s == null ) return EOF;

  if( isItem(s) ){
         s = t.next();
         if( isFolder(s) )     return nextFolder(s);
         if( isBookmark(s))    return nextBookmark(s);
         error("ITEM: Unknown type: "+s);
         return UNKNOWN;
     }
     else if( isFolderEnd(s))  return nextFolderEnd(s);
     else if( isSeparator(s))  return nextSeparator(s);
     else                      return nextUnknown(s);
 }






 // ------------------- protected methods below -----------------//


 boolean isItem     (String s) { return s.equals("<DT>"); }
 boolean isFolder   (String s) { return s.startsWith("<H3"); }
 boolean isBookmark (String s) { return s.startsWith("<a href"); }
 boolean isFolderEnd(String s) { return s.equals("</DL>"); }
 boolean isSeparator(String s) { return s.equals("<hr>"); }


 int nextFolder   (String s)   throws IOException
 {
     name = t.next();    link = null;
     String folderEnd = t.next();
     if( !folderEnd.equals("</H3>") )
         error("FOLDER_END: expected </H3>, got "+folderEnd);
     return type = FOLDER;
 }


 int nextBookmark (String s) throws IOException
 {
     int firstQuote;
     link = s.substring(
firstQuote = s.indexOf('"') + 1
        ,    s.indexOf('"', firstQuote)
     );
     name = t.next();
     if( name.equals("</a>") )                            // no bookmark name specified
         name = "";
     else {
         String bookmarkEnd = t.next();
         if( ! bookmarkEnd.equals("</a>") )              // clear until the end of <a ..>...</a>
error("ITEM: Expected </a>, got "+bookmarkEnd
    +", bookmark name="+ name);
     }
     return type = BOOKMARK;
 }


 int nextFolderEnd(String s){    return type = FOLDER_END;}
 int nextSeparator(String s){    return type = SEPARATOR;}
 int nextUnknown  (String s){    return type = UNKNOWN;}



/*


 public static void main(String args[])
     throws FileNotFoundException, IOException
 {
      if( args.length < 1 ){
         System.out.println("Usage: java BookmarkParser bookmark.htm");
         return;
     }

  System.out.println("Loading file "+args[0]);

  FileReader r = new FileReader(args[0]);
     BookmarkParser p = new BookmarkParser(r);

  while( p.next() != BookmarkParser.EOF ){
         switch(p.getType()){
         case p.BOOKMARK:
   print("BOOKMARK: " + p.getName() + " -> " + p.getLink());
break;
         case p.FOLDER:
   print("FOLDER START ----" + p.getName() );
break;
         case p.FOLDER_END:
   print("FOLDER END ----");
break;
         default:
   break;
         }
     }    // while
 }

*/
 static void print(String s){ System.out.println(s); }
 static void error(String s){ System.out.println("*** " + s); }



}

