//***************************************************************************
// This source code is copyrighted 2002 by Google Inc.  All rights
// reserved.  You are given a limited license to use this source code for
// purposes of participating in the Google programming contest.  If you
// choose to use or distribute the source code for any other purpose, you
// must either (1) first obtain written approval from Google, or (2)
// prominently display the foregoing copyright notice and the following
// warranty and liability disclaimer on each copy used or distributed.
// 
// The source code and repository (the "Software") is provided "AS IS",
// with no warranty, express or implied, including but not limited to the
// implied warranties of merchantability and fitness for a particular
// use.  In no event shall Google Inc. be liable for any damages, direct
// or indirect, even if advised of the possibility of such damages.
//***************************************************************************


// This is for testing the preparser.  It prints to
// stdout most callbacks that it gets.

#include <stdio.h>
#include "goo-handler-parser.h"    // where parsehandlers are defined


class PreparseCatParseHandler : public ParseHandler {
 public:
  virtual void NewDocument(const Document* doc) {
    printf("New document: '%s'\n", doc->url());
    in_anchor_ = false;            // initial value for this document
    just_put_whitespace_ = false;
    just_put_term_or_punc_ = false;
  }

  virtual void EndDocument(const Document* doc) {
    printf("End of document\n");
  }

  virtual void AddHeader(const char* key, int keylen,
                         const char* value, int valuelen) {
    printf("Header: '%.*s'='%.*s'\n", keylen, key, valuelen, value);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
  }

  virtual void AddResponseCode(int response_code) {
    printf("AddResponseCode: %d\n", response_code);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
  }

  virtual void AddTerm(const char* term, int termlen, int face, int size) {
    printf("AddTerm: '%.*s' (face=%d, size=%d%s)\n",
           termlen, term, face, size, in_anchor_ ? ", in anchor" : "");
    just_put_whitespace_ = false; 
    just_put_term_or_punc_ = true;
   }

  virtual void AddBaseURL(const char* baseurl, int baseurllen) {
    printf("AddBaseURL: '%.*s'\n", baseurllen, baseurl);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddAnchor(const char* href, int hreflen) {
    printf("AddAnchor: '%.*s'\n", hreflen, href);
    in_anchor_ = true;
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddLocalName(const char * name, int namelen) {
    printf("AddLocalName: '%.*s'\n", namelen, name);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AnchorDone() {
    printf("Done with anchor text\n");
    in_anchor_ = false;
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddImage(const char* tag, int taglen) {
    printf("AddImage: '%.*s'\n", taglen, tag);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddApplet(const char* code, int codelen) {
    printf("AddApplet: '%.*s'\n", codelen, code);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddIFrame(const char *text, int textlen) {
    printf("AddIFrame: '%.*s'\n", textlen, text);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddIFrameDone() {
    printf("AddIFrameDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddArea(const char* href, int hreflen) {
    printf("AddArea: '%.*s'\n", hreflen, href);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddFrame(const char* src, int srclen) {
    printf("AddFrame: '%.*s'\n", srclen, src);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddFrameset(const char* src, int srclen) {
    printf("AddFrameset: '%.*s'\n", srclen, src);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddFramesetDone() { 
    printf("AddFramesetDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddMeta(const char* meta, int metalen) {
    printf("AddMeta: '%.*s'\n", metalen, meta);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddBody(const char* body, int bodylen) {
    printf("AddBody: '%.*s'\n", bodylen, body);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddBodyDone() {
    printf("AddBodyDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void ParagraphStart(const char *fields, int fieldlen) {
    printf("Paragraph Start: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void ParagraphEnd() {
    printf("Paragraph End\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddPunctuation(const char * text, int textlen, int face,
                                int size) {
    printf("AddPunctuation: %.*s (face=%d, size=%d%s)\n",
           textlen, text, face, size, in_anchor_ ? ", in anchor" : "");
           
    just_put_whitespace_ = false; 
    just_put_term_or_punc_ = true;
   }

  // These are useful for tables...
  virtual void AddTable() { 
    printf("Table\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddTableDone() { 
    printf("TableDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddCaption() { 
    printf("Caption\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddCaptionDone() { 
    printf("CaptionDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddTableHCell(const char* fields, int fieldlen) {
    printf("TableHCell: %.*s\n", fieldlen, fields); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddTableDCell(const char* fields, int fieldlen) {
    printf("TableDCell: %.*s\n", fieldlen, fields); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddTableRow() { 
    printf("TableRow\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddTableRowDone() { 
    printf("TableRowDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  // Forms
  virtual void AddForm(const char * fields, int fieldlen) {
    printf("Form\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddFormDone() { 
    printf("FormDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddSelect(const char * fields, int fieldlen) {
    printf("Select\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }
  virtual void AddSelectDone() { 
    printf("SelectDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddNoframes() { 
    printf("Noframes\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddNoframesDone() { 
    printf("NoframesDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void AddOption(const char * fields, int fieldlen) {
    printf("Option: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddOptionDone() { 
    printf("OptionDone\n"); 
    just_put_whitespace_ = false; just_put_term_or_punc_ = false; 
  }

  virtual void ChangeFontColor(const char* color, int len) {
    printf("ChangeFontColor: '%.*s'\n", len, color);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void ChangeBGColor(const char* color, int len) {
    printf("ChangeBGColor: '%.*s'\n", len, color);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void ChangeFontColorEnd() {
    printf("ChangeFontColorEnd\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void ChangeBGColorEnd() {
    printf("ChangeBGColorEnd\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddBreak() {
    printf("AddBreak\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddHorizontalRule() {
    printf("AddHorizontalRule\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddListItem() {
    printf("AddListItem\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddUnorderedList() {
    printf("AddUnorderedList\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddOrderedList() {
    printf("AddOrderedList\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddListDone() {
    printf("AddListDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddTextAreaDone() {
    printf("AddTextAreaDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddTableCellDone() {
    printf("AddTableCellDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddDiv(const char* fields, int fieldlen) {
    printf("AddDiv: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddDivDone(const char * fields, int fieldlen) {
    printf("AddDivDone: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddSpan(const char* fields, int fieldlen) {
    printf("AddSpan: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddSpanDone(const char * fields, int fieldlen) {
    printf("AddSpanDone: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddInput(const char* fields, int fieldlen) {
    printf("AddInput: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddHeading(int hnum) {
    printf("AddHeading: %d\n", hnum);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddHeadingDone() {
    printf("AddHeadingDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void WhitespaceEndedTerm() {
    if (just_put_term_or_punc_ && ! just_put_whitespace_) 
      printf("WhitespaceEndedTerm\n");
    just_put_whitespace_ = true;
   }

  virtual void AddObject(const char* fields, int fieldlen) {
    printf("AddObject\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddObjectDone() {
    printf("AddObjectDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddParam(const char* fields, int fieldlen) {
    printf("AddParam\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddEmbed(const char* fields, int fieldlen) {
    printf("AddEmbed\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddHead(const char* fields, int fieldlen) {
    printf("AddHead: '%.*s'\n", fieldlen, fields);
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

  virtual void AddHeadDone() {
    printf("AddHeadDone\n");
    just_put_whitespace_ = false; just_put_term_or_punc_ = false;
   }

 private:
  bool in_anchor_;
  bool just_put_whitespace_;
  bool just_put_term_or_punc_;
};

ParseHandler* MakeCatHandler() {
  return new PreparseCatParseHandler;
}
