ROOT logo
#ifndef __TMrbTidy_h__
#define __TMrbTidy_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbTidy.h
// Purpose:        Interface to Dave Raggett's TIDY library
// Description:    Class definitions to implement an interface to Tidy
//                 Provides wrapper classes for tidy structures
//                    TidyDoc, TidyNode, TidyOption, and TidyAttr
// Author:         R. Lutter
// Revision:       $Id: TMrbTidy.h,v 1.22 2007-08-03 10:11:05 Rudolf.Lutter Exp $       
// Date:           
// Keywords:
//////////////////////////////////////////////////////////////////////////////

#include "Rtypes.h"

#include "TNamed.h"
#include "TString.h"

#include "TMrbNamedX.h"
#include "TMrbString.h"
#include "TMrbLofNamedX.h"

#include "TMrbString.h"

#include "tidy_protos.h"

class TMrbTidyOption;
class TMrbTidyAttr;
class TMrbTidyNode;
class TMrbTidyDoc;

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbTidyOption
// Purpose:        A tidy option
// Description:    Wrapper class for struct TidyOption
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbTidyOption : public TMrbNamedX {

 	public:
		TMrbTidyOption() {};
		TMrbTidyOption(TidyOptionId OptId, const Char_t * OptName, TidyOption OptHandle, TMrbTidyDoc * Doc);
		virtual ~TMrbTidyOption() {};

		inline TidyOptionId GetId() { return((TidyOptionId) this->GetIndex()); };
		inline TidyOptionType GetType() { return(fType); };
		inline void SetType(TidyOptionType Type) { fType = Type; };
		inline Bool_t IsReadOnly() { return(tidyOptIsReadOnly(fHandle)); };

		Bool_t GetDefault(TString & String);
		Bool_t GetDefault(Int_t & Value);
		Bool_t GetDefault(Bool_t & Flag);

		Bool_t GetValue(TString & String);
		Bool_t GetValue(Int_t & Value);
		Bool_t GetValue(Bool_t & Flag);

		Bool_t SetValue(Char_t * String);
		Bool_t SetValue(Int_t Value);
		Bool_t SetValue(Bool_t Flag);

		void Print(Option_t * Option) const { TObject::Print(Option); }
		void Print(ostream & Out = cout, Bool_t Verbose = kFALSE);

		void Reset();

		inline TidyOption GetHandle() { return(fHandle); };

		inline TMrbTidyDoc * GetTidyDoc() { return(fTidyDoc); };

	protected:
		TidyOption fHandle; 			// tidy option handle
		TidyOptionType fType;			// option type

		TMrbTidyDoc * fTidyDoc;				// associated tidy document

	ClassDef(TMrbTidyOption, 1) 		// [Utils] Tidy interface: option
};

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbTidyAttr
// Purpose:        A tidy attribute spec
// Description:    Wrapper class for struct TidyAttr
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbTidyAttr : public TMrbNamedX {

 	public:
		TMrbTidyAttr() {};
		TMrbTidyAttr(TidyAttrId AttrId, const Char_t * AttrName, TidyOption OptHandle, TMrbTidyNode * Node);
		virtual ~TMrbTidyAttr() {};

		inline void SetValue(const Char_t * Value) { fValue = Value; };
		inline const Char_t * GetValue() { return(fValue.Data()); };
		Bool_t GetValue(TString & ValStr, TString & CmtStr);

		inline TidyAttrId GetId() { return((TidyAttrId) this->GetIndex()); };

		Bool_t IsEvent();
		Bool_t IsProp();
		Bool_t IsHREF();
		Bool_t IsSRC();
		Bool_t IsID();
		Bool_t IsNAME();
		Bool_t IsSUMMARY();
		Bool_t IsALT();
		Bool_t IsLONGDESC();
		Bool_t IsUSEMAP();
		Bool_t IsISMAP();
		Bool_t IsLANGUAGE();
		Bool_t IsTYPE();
		Bool_t IsVALUE();
		Bool_t IsCONTENT();
		Bool_t IsTITLE();
		Bool_t IsXMLNS();
		Bool_t IsDATAFLD();
		Bool_t IsWIDTH();
		Bool_t IsHEIGHT();
		Bool_t IsFOR();
		Bool_t IsSELECTED();
		Bool_t IsCHECKED();
		Bool_t IsLANG();
		Bool_t IsTARGET();
		Bool_t IsHTTP_EQUIV();
		Bool_t IsREL();
		Bool_t IsOnMOUSEMOVE();
		Bool_t IsOnMOUSEDOWN();
		Bool_t IsOnMOUSEUP();
		Bool_t IsOnCLICK();
		Bool_t IsOnMOUSEOVER();
		Bool_t IsOnMOUSEOUT();
		Bool_t IsOnKEYDOWN();
		Bool_t IsOnKEYUP();
		Bool_t IsOnKEYPRESS();
		Bool_t IsOnFOCUS();
		Bool_t IsOnBLUR();
		Bool_t IsBGCOLOR();
		Bool_t IsLINK();
		Bool_t IsALINK();
		Bool_t IsVLINK();
		Bool_t IsTEXT();
		Bool_t IsSTYLE();
		Bool_t IsABBR();
		Bool_t IsCOLSPAN();
		Bool_t IsROWSPAN();

		inline TidyAttr GetHandle() { return(fHandle); };

	protected:
		TidyAttr fHandle;
		TString fValue; 			// attr value

	ClassDef(TMrbTidyAttr, 1) 		// [Utils] Tidy interface: attribute
};

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbTidyNode
// Purpose:        A tidy node spec
// Description:    Wrapper class for struct TidyNode
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbTidyNode : public TMrbNamedX {

	public:

		enum EMrbTidySubstType	{	kMrbTidySubstUndefined	=	0,
									kMrbTidySubstLocalDef	=	BIT(0),
									kMrbTidySubstInherited 	=	BIT(1),
									kMrbTidySubstInUse	 	=	BIT(2),
									kMrbTidySubstValueSet	=	BIT(3)
								};

 	public:
		TMrbTidyNode() {};
		TMrbTidyNode(TidyTagId NodeId, const Char_t * NodeName, TMrbTidyNode * Parent, TidyNode NodeHandle, TMrbTidyDoc * Doc);
		virtual ~TMrbTidyNode() {};

		inline TidyNodeType GetType() { return(fType); };
		inline void SetType(TidyNodeType Type) { fType = Type; };
		inline TidyTagId GetId() { return((TidyTagId) this->GetIndex()); };

		inline TMrbTidyNode * GetFirst() { return((TMrbTidyNode *) fLofChilds.First()); };
		inline TMrbTidyNode * GetParent() { return(fParent); };
		inline TMrbTidyNode * GetNext(TMrbTidyNode * Child) { return((TMrbTidyNode *) fLofChilds.After((TMrbTidyNode *) Child)); };
		inline TMrbTidyNode * GetPrev(TMrbTidyNode * Child) { return((TMrbTidyNode *) fLofChilds.Before((TMrbTidyNode *) Child)); };

		const Char_t * GetText(TString & Buffer);

		inline void SetParent(TMrbTidyNode * Parent) { fParent = Parent; };

		inline Int_t GetTreeLevel() { return(fTreeLevel); };
		inline void SetTreeLevel(Int_t Level) { fTreeLevel = Level; };
		inline void SetTreeLevelFromParent() { fTreeLevel = fParent ? fParent->GetTreeLevel() + 1 : 1; };

		inline Int_t GetIndentLevel() { return(fIndentLevel); };
		void SetIndentLevel(Int_t Level, Bool_t Recursive = kFALSE);
		Int_t SetIndentation();

		Bool_t HasTextChildsOnly();
		const Char_t * CollectTextFromChilds(TString & Buffer);
		Int_t CollectSubstUsedByChilds(TMrbLofNamedX & LofSubst, Bool_t TextChildsOnly = kTRUE);
		inline TMrbTidyNode * Parent() { return(fParent); };

		void FillTree();
		void DeleteTree();
		Int_t StepTree(TObjArray & LofNodes);
		TMrbTidyNode * ImplantTreeFromFile(const Char_t * File = NULL, const Char_t * Mtag = NULL);

		inline TMrbLofNamedX * GetLofChilds() { return(&fLofChilds); };
		inline TMrbLofNamedX * GetLofAttr() { return(&fLofAttr); };

		Bool_t IsText();
		Bool_t IsProp();
		Bool_t IsHeader();
		Bool_t HasText();
		Bool_t IsHTML();
		Bool_t IsHEAD();
		Bool_t IsTITLE();
		Bool_t IsBASE();
		Bool_t IsMETA();
		Bool_t IsBODY();
		Bool_t IsFRAMESET();
		Bool_t IsFRAME();
		Bool_t IsIFRAME();
		Bool_t IsNOFRAMES();
		Bool_t IsHR();
		Bool_t IsH1();
		Bool_t IsH2();
		Bool_t IsPRE();
		Bool_t IsLISTING();
		Bool_t IsP();
		Bool_t IsUL();
		Bool_t IsOL();
		Bool_t IsDL();
		Bool_t IsDIR();
		Bool_t IsLI();
		Bool_t IsDT();
		Bool_t IsDD();
		Bool_t IsTABLE();
		Bool_t IsCAPTION();
		Bool_t IsTD();
		Bool_t IsTH();
		Bool_t IsTR();
		Bool_t IsCOL();
		Bool_t IsCOLGROUP();
		Bool_t IsBR();
		Bool_t IsAA();
		Bool_t IsLINK();
		Bool_t IsB();
		Bool_t IsI();
		Bool_t IsSTRONG();
		Bool_t IsEM();
		Bool_t IsBIG();
		Bool_t IsSMALL();
		Bool_t IsPARAM();
		Bool_t IsOPTION();
		Bool_t IsOPTGROUP();
		Bool_t IsIMG();
		Bool_t IsMAP();
		Bool_t IsAREA();
		Bool_t IsNOBR();
		Bool_t IsWBR();
		Bool_t IsFONT();
		Bool_t IsLAYER();
		Bool_t IsSPACER();
		Bool_t IsCENTER();
		Bool_t IsSTYLE();
		Bool_t IsSCRIPT();
		Bool_t IsNOSCRIPT();
		Bool_t IsFORM();
		Bool_t IsTEXTAREA();
		Bool_t IsBLOCKQUOTE();
		Bool_t IsAPPLET();
		Bool_t IsOBJECT();
		Bool_t IsDIV();
		Bool_t IsSPAN();
		Bool_t IsINPUT();
		Bool_t IsQ();
		Bool_t IsLABEL();
		Bool_t IsH3();
		Bool_t IsH4();
		Bool_t IsH5();
		Bool_t IsH6();
		Bool_t IsADDRESS();
		Bool_t IsXMP();
		Bool_t IsSELECT();
		Bool_t IsBLINK();
		Bool_t IsMARQUEE();
		Bool_t IsEMBED();
		Bool_t IsBASEFONT();
		Bool_t IsISINDEX();
		Bool_t IsS();
		Bool_t IsSTRIKE();
		Bool_t IsU();
		Bool_t IsMENU();

		inline Bool_t IsRoot() { return(this->GetType() == TidyNode_Root); };
		inline Bool_t IsComment() { return(this->GetType() == TidyNode_Comment); };

		inline TMrbTidyAttr * GetAttribute(TidyAttrId AttrId) { return((TMrbTidyAttr *) fLofAttr.FindByIndex((Int_t) AttrId)); };
		inline TMrbTidyAttr * GetAttrFirst() { return((TMrbTidyAttr *) fLofAttr.First()); };
		inline TMrbTidyAttr * GetAttrNext(TMrbTidyAttr * Attr) { return((TMrbTidyAttr *) fLofAttr.After((TMrbTidyAttr *) Attr)); };

		TMrbTidyAttr * GetAttrHREF();
		TMrbTidyAttr * GetAttrSRC();
		TMrbTidyAttr * GetAttrID();
		TMrbTidyAttr * GetAttrNAME();
		TMrbTidyAttr * GetAttrSUMMARY();
		TMrbTidyAttr * GetAttrALT();
		TMrbTidyAttr * GetAttrLONGDESC();
		TMrbTidyAttr * GetAttrUSEMAP();
		TMrbTidyAttr * GetAttrISMAP();
		TMrbTidyAttr * GetAttrLANGUAGE();
		TMrbTidyAttr * GetAttrTYPE();
		TMrbTidyAttr * GetAttrVALUE();
		TMrbTidyAttr * GetAttrCONTENT();
		TMrbTidyAttr * GetAttrTITLE();
		TMrbTidyAttr * GetAttrXMLNS();
		TMrbTidyAttr * GetAttrDATAFLD();
		TMrbTidyAttr * GetAttrWIDTH();
		TMrbTidyAttr * GetAttrHEIGHT();
		TMrbTidyAttr * GetAttrFOR();
		TMrbTidyAttr * GetAttrSELECTED();
		TMrbTidyAttr * GetAttrCHECKED();
		TMrbTidyAttr * GetAttrLANG();
		TMrbTidyAttr * GetAttrTARGET();
		TMrbTidyAttr * GetAttrHTTP_EQUIV();
		TMrbTidyAttr * GetAttrREL();
		TMrbTidyAttr * GetAttrOnMOUSEMOVE();
		TMrbTidyAttr * GetAttrOnMOUSEDOWN();
		TMrbTidyAttr * GetAttrOnMOUSEUP();
		TMrbTidyAttr * GetAttrOnCLICK();
		TMrbTidyAttr * GetAttrOnMOUSEOVER();
		TMrbTidyAttr * GetAttrOnMOUSEOUT();
		TMrbTidyAttr * GetAttrOnKEYDOWN();
		TMrbTidyAttr * GetAttrOnKEYUP();
		TMrbTidyAttr * GetAttrOnKEYPRESS();
		TMrbTidyAttr * GetAttrOnFOCUS();
		TMrbTidyAttr * GetAttrOnBLUR();
		TMrbTidyAttr * GetAttrBGCOLOR();
		TMrbTidyAttr * GetAttrLINK();
		TMrbTidyAttr * GetAttrALINK();
		TMrbTidyAttr * GetAttrVLINK();
		TMrbTidyAttr * GetAttrTEXT();
		TMrbTidyAttr * GetAttrSTYLE();
		TMrbTidyAttr * GetAttrABBR();
		TMrbTidyAttr * GetAttrCOLSPAN();
		TMrbTidyAttr * GetAttrROWSPAN();

		inline TidyNode GetHandle() { return(fHandle); };

		Bool_t CheckMnode();
		inline Bool_t IsMnode() const { return(fIsMnode); };
		Bool_t CheckEndTag();
		inline Bool_t HasEndTag() const { return(fHasEndTag); };

		TMrbTidyNode * Find(const Char_t * NodeName, const Char_t * NodeAttributes = NULL, Bool_t Recursive = kFALSE);
		TMrbTidyNode * Find(const Char_t * NodeName, TObjArray & LofAttr, Bool_t Recursive = kFALSE);
		Int_t Find(TObjArray & LofNodes, const Char_t * NodeName, const Char_t * NodeAttributes = NULL, Bool_t Recursive = kFALSE);
		Int_t Find(TObjArray & LofNodes, const Char_t * NodeName, TObjArray & LofAttr, Bool_t Recursive = kFALSE);

		TMrbTidyNode * FindByAttr(const Char_t * AttrName, const Char_t * AttrVal, Bool_t Recursive = kFALSE, Bool_t IncludeTopLevel = kFALSE);
		inline TMrbTidyNode * FindByMtag(const Char_t * Tag, Bool_t Recursive = kFALSE, Bool_t IncludeTopLevel = kFALSE) {
							return(this->FindByAttr("mtag", Tag, Recursive, IncludeTopLevel));
		};
		inline TMrbTidyNode * FindByMcase(const Char_t * Tag, Bool_t Recursive = kFALSE, Bool_t IncludeTopLevel = kFALSE) {
							return(this->FindByAttr("mcase", Tag, Recursive, IncludeTopLevel));
		};

		inline Bool_t HasChilds() { return(this->GetLofChilds()->GetEntries() > 0); };

		void Print(Option_t * Option) const { TObject::Print(Option); }
		void Print(ostream & Out = cout, Bool_t Verbose = kFALSE, Bool_t HtmlFlag = kFALSE);
		void PrintTree(ostream & Out = cout, Bool_t Verbose = kFALSE, Bool_t HtmlFlag = kFALSE);

		void TraceBack(ostream & Out = cout, Int_t NofLevels = 0);

		Bool_t OutputHtml(ostream & Out = cout);
		Bool_t OutputHtmlForMnodes(ostream & Out = cout);
		void OutputHtmlTree(ostream & Out = cout);

		Int_t InitSubstitutions(Bool_t Recursive = kFALSE, Bool_t ReInit = kFALSE);
		Bool_t Substitute(const Char_t * ParamName, const Char_t * ParamValue, Bool_t Recursive = kFALSE, Bool_t Verbose = kFALSE);	// substitute arguments
		Bool_t Substitute(const Char_t * ParamName, Int_t ParamValue, Int_t ParamBase = 10, Bool_t Recursive = kFALSE, Bool_t Verbose = kFALSE);
		Bool_t Substitute(const Char_t * ParamName, Double_t ParamValue, Bool_t Recursive = kFALSE, Bool_t Verbose = kFALSE);
		Bool_t CheckSubstitutions(Bool_t Recursive = kFALSE, Bool_t Verbose = kTRUE);
		void ClearSubstitutions(Bool_t Recursive = kFALSE);
		void PrintSubstitutions(Bool_t Recursive = kFALSE, ostream & Out = cout);
		Int_t GetSubstitutionType(const Char_t * ParamName) const;

		inline TMrbLofNamedX * GetLofSubstitutions() { return(&fLofSubstitutions); };

		Bool_t OutputSubstituted(const Char_t * CaseString = NULL, ostream & Out = cout);
		Bool_t OutputSubstituted(TObjArray & LofCaseStrings, ostream & Out = cout);

		Int_t InitLinks(Bool_t Recursive = kFALSE, Bool_t ReInit = kFALSE);
		inline TMrbLofNamedX * GetLofLinks() { return(&fLofLinks); };

		inline void AddChild(TMrbTidyNode * Child) { fLofChilds.Add(Child); };

		inline TMrbTidyDoc * GetTidyDoc() { return(fTidyDoc); };

	protected:
		Int_t ReadAttr();
		Int_t DecodeAttrString(TObjArray & LofAttr, const Char_t * AttrStr);
		Bool_t CompareAttributes(TObjArray & LofAttr);

		Bool_t OutputHtmlForMB(ostream & Out = cout);
		Bool_t OutputHtmlForMH(ostream & Out = cout);
		Bool_t OutputHtmlForMX(ostream & Out = cout);
		Bool_t OutputHtmlForMC(ostream & Out = cout);
		Bool_t OutputHtmlForMI(ostream & Out = cout);
		Bool_t OutputHtmlForMS(ostream & Out = cout);

		void ProcessMnodeHeader(ostream & Out, const Char_t * CssClass, Int_t Level);
		const Char_t * MarkSubstitutions(TString & Buffer);
		const Char_t * PrepareForHtmlOutput(TString & Buffer);
		const Char_t * PrepareForCodeOutput(TString & Buffer);
		const Char_t * MarkLinks(TString & Buffer);

		const Char_t * Emphasize(TString & String, Bool_t Remove = kFALSE);

		TMrbTidyNode * ScanTidyTree(TidyNode Node, const Char_t * AttrName, const Char_t * AttrString, TMrbTidyDoc * Doc = NULL);

	protected:
		TidyNode fHandle; 					// tidy node handle
		TidyNodeType fType; 				// type
		Int_t fTreeLevel;					// tree level (mnodes)
		Int_t fIndentLevel;					// indent level (code)

		Bool_t fIsMnode; 					// is special marabou node
		Bool_t fHasEndTag;					// kTRUE if end tag needed

		TMrbTidyNode * fParent; 			// parent node
		TMrbTidyDoc * fTidyDoc;					// associated tidy document

		TMrbLofNamedX fLofChilds;			// child nodes
		TMrbLofNamedX fLofAttr; 			// list of attributes

		TMrbLofNamedX fLofSubstitutions;	// current substitutions
		TMrbLofNamedX fLofLinks;			// current links

	ClassDef(TMrbTidyNode, 1) 				// [Utils] Tidy interface: node
};

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbTidyDoc
// Purpose:        A document tree for tidy
// Description:    Create a tidy document tree
//                 Wrapper class for struct TidyDoc
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbTidyDoc : public TNamed {

 	public:
		TMrbTidyDoc();
		TMrbTidyDoc(const Char_t * DocName);
		TMrbTidyDoc(const Char_t * DocName, const Char_t * DocFile, Bool_t Repair = kFALSE, const Char_t * CfgFile = NULL);
		TMrbTidyDoc(const Char_t * DocName, istream & Stream, Bool_t Repair = kFALSE, const Char_t * CfgFile = NULL);
		TMrbTidyDoc(const Char_t * DocName, TString & Buffer, Bool_t Repair = kFALSE, const Char_t * CfgFile = NULL);
		virtual ~TMrbTidyDoc() { this->Reset(kTRUE); };

		void Reset(Bool_t Release = kFALSE);
		inline Int_t GetStatus() const { return(tidyStatus(fHandle)); };
		inline Int_t GetHtmlVersion() const { return(tidyDetectedHtmlVersion(fHandle)); };
		inline Bool_t IsXhtml() const { return(tidyDetectedXhtml(fHandle)); };
		inline Bool_t IsXml() const { return(tidyDetectedGenericXml(fHandle)); };
		inline Int_t GetErrorCount() const { return((Int_t) tidyErrorCount(fHandle)); };
		inline Int_t GetWarningCount() const { return((Int_t) tidyWarningCount(fHandle)); };
		inline Int_t GetAccessWarningCount() const { return((Int_t) tidyAccessWarningCount(fHandle)); };

		inline const Char_t * GetErrorBuffer() { return(fErrorBuffer.bp); };
		inline void PrintDiagnostics(ostream & Out = cout) { Out << this->GetErrorBuffer() << endl; };

		Bool_t LoadConfig(const Char_t * CfgFile);
		inline Int_t GetConfigErrorCount() const { return(tidyConfigErrorCount(fHandle)); };

		inline Bool_t SetOption(TidyOptionId OptionId, Bool_t Flag) {
			TMrbTidyOption * opt = (TMrbTidyOption *) fLofOptions.FindByIndex((Int_t ) OptionId);
			if (opt) return(opt->SetValue(Flag)); else return(kFALSE);
		};
		inline Bool_t SetOption(TidyOptionId OptionId, Int_t Value) {
			TMrbTidyOption * opt = (TMrbTidyOption *) fLofOptions.FindByIndex((Int_t ) OptionId);
			if (opt) return(opt->SetValue(Value)); else return(kFALSE);
		};
		inline Bool_t SetOption(TidyOptionId OptionId, const Char_t * String) {
			TMrbTidyOption * opt = (TMrbTidyOption *) fLofOptions.FindByIndex((Int_t ) OptionId);
			if (opt) return(opt->SetValue(String)); else return(kFALSE);
		};
		inline TMrbLofNamedX * GetLofOptions() { return(&fLofOptions); };

		inline TMrbLofNamedX * GetLofMnodes() { return(&fLofMnodes); };

		Bool_t ParseFile(const Char_t * DocFile, Bool_t Repair = kFALSE);
		Bool_t ParseBuffer(const Char_t * Buffer, Bool_t Repair = kFALSE);
		inline Bool_t ParseBuffer(TString & Buffer, Bool_t Repair = kFALSE) { return(this->ParseBuffer(Buffer.Data(), Repair)); };

		inline Bool_t IsRepaired() { return(fRepair); };
		Bool_t CleanAndRepair();
		Bool_t RunDiagnostics();

		inline Bool_t HasNodes() { return((fTidyRoot != NULL) && fTidyRoot->HasChilds()); };

		inline void StripText(Bool_t Flag = kTRUE) { fStripText = Flag; };
		inline Bool_t TextToBeStripped() { return(fStripText); };

		inline TidyDoc GetHandle() const { return(fHandle); };
		inline const Char_t * GetDocFile() const { return(fDocFile.Length() ? fDocFile.Data() : NULL); };
		inline const Char_t * GetCfgFile() const { return(fCfgFile.Length() ? fCfgFile.Data() : NULL); };

		inline Bool_t ResetOptions() { return(tidyOptResetAllToDefault(fHandle)); };

		void Print(Option_t * Option) const { TObject::Print(Option); }
		void Print(const Char_t * File, Bool_t Verbose = kFALSE, Bool_t HtmlFlag = kFALSE);
		void Print(ostream & Out = cout, Bool_t Verbose = kFALSE, Bool_t HtmlFlag = kFALSE);

		void PrintOptions(ostream & Out = cout, Bool_t Verbose = kFALSE);

		inline TMrbTidyNode * GetRoot() { return(fTidyRoot); };
		inline TMrbTidyNode * GetHtml() { return(fTidyHtml); };
		inline TMrbTidyNode * GetHead() { return(fTidyHead); };
		inline TMrbTidyNode * GetBody() { return(fTidyBody); };
		inline TMrbTidyNode * GetMbody() { return(fTidyMbody); };

		inline void SetMnodeFlag(Bool_t Flag = kTRUE) { fHasMnodes = Flag; };
		inline Bool_t HasMnodes() { return(fHasMnodes); };

		Bool_t OutputHtml(const Char_t * HtmlFile);
		Bool_t OutputHtml(ostream & Out = cout);

		Bool_t AddToList(); 			// add to list of documents

		const Char_t * GetDocName(Bool_t LongFlag = kFALSE);

	protected:
		Int_t ReadOptions();
		void InitErrorBuffer();
		Bool_t IsFirstChild();
		Bool_t IsLastChild();

	protected:
		TidyDoc fHandle;				// tidy doc handle
		TString fDocFile;				// name of document file
		TString fCfgFile;				// name of configuration file
		Bool_t fRepair; 				// kTRUE if 'clean and repair' is to be called
		Bool_t fStripText;				// kTRUE if <cr>s surrounding text have to be stripped
		Bool_t fHasMnodes;				// kTRUE if special marabou nodes exist
		TMrbTidyNode * fTidyRoot;		// ptr to whole document
		TMrbTidyNode * fTidyHtml;		// ptr to <html>...</html>
		TMrbTidyNode * fTidyHead;		// prt to <head>...</head>
		TMrbTidyNode * fTidyBody;		// ptr to <body>...</body>
		TMrbTidyNode * fTidyMbody;		// ptr to <mb>...</mb>
	
		TMrbLofNamedX fLofOptions;			// list of options
		TMrbLofNamedX fLofMnodes;			// list of special marabou nodes

		TidyBuffer fErrorBuffer;		// internal error buffer

	ClassDef(TMrbTidyDoc, 1) 			// [Utils] Tidy interface: document
};

#endif
 TMrbTidy.h:1
 TMrbTidy.h:2
 TMrbTidy.h:3
 TMrbTidy.h:4
 TMrbTidy.h:5
 TMrbTidy.h:6
 TMrbTidy.h:7
 TMrbTidy.h:8
 TMrbTidy.h:9
 TMrbTidy.h:10
 TMrbTidy.h:11
 TMrbTidy.h:12
 TMrbTidy.h:13
 TMrbTidy.h:14
 TMrbTidy.h:15
 TMrbTidy.h:16
 TMrbTidy.h:17
 TMrbTidy.h:18
 TMrbTidy.h:19
 TMrbTidy.h:20
 TMrbTidy.h:21
 TMrbTidy.h:22
 TMrbTidy.h:23
 TMrbTidy.h:24
 TMrbTidy.h:25
 TMrbTidy.h:26
 TMrbTidy.h:27
 TMrbTidy.h:28
 TMrbTidy.h:29
 TMrbTidy.h:30
 TMrbTidy.h:31
 TMrbTidy.h:32
 TMrbTidy.h:33
 TMrbTidy.h:34
 TMrbTidy.h:35
 TMrbTidy.h:36
 TMrbTidy.h:37
 TMrbTidy.h:38
 TMrbTidy.h:39
 TMrbTidy.h:40
 TMrbTidy.h:41
 TMrbTidy.h:42
 TMrbTidy.h:43
 TMrbTidy.h:44
 TMrbTidy.h:45
 TMrbTidy.h:46
 TMrbTidy.h:47
 TMrbTidy.h:48
 TMrbTidy.h:49
 TMrbTidy.h:50
 TMrbTidy.h:51
 TMrbTidy.h:52
 TMrbTidy.h:53
 TMrbTidy.h:54
 TMrbTidy.h:55
 TMrbTidy.h:56
 TMrbTidy.h:57
 TMrbTidy.h:58
 TMrbTidy.h:59
 TMrbTidy.h:60
 TMrbTidy.h:61
 TMrbTidy.h:62
 TMrbTidy.h:63
 TMrbTidy.h:64
 TMrbTidy.h:65
 TMrbTidy.h:66
 TMrbTidy.h:67
 TMrbTidy.h:68
 TMrbTidy.h:69
 TMrbTidy.h:70
 TMrbTidy.h:71
 TMrbTidy.h:72
 TMrbTidy.h:73
 TMrbTidy.h:74
 TMrbTidy.h:75
 TMrbTidy.h:76
 TMrbTidy.h:77
 TMrbTidy.h:78
 TMrbTidy.h:79
 TMrbTidy.h:80
 TMrbTidy.h:81
 TMrbTidy.h:82
 TMrbTidy.h:83
 TMrbTidy.h:84
 TMrbTidy.h:85
 TMrbTidy.h:86
 TMrbTidy.h:87
 TMrbTidy.h:88
 TMrbTidy.h:89
 TMrbTidy.h:90
 TMrbTidy.h:91
 TMrbTidy.h:92
 TMrbTidy.h:93
 TMrbTidy.h:94
 TMrbTidy.h:95
 TMrbTidy.h:96
 TMrbTidy.h:97
 TMrbTidy.h:98
 TMrbTidy.h:99
 TMrbTidy.h:100
 TMrbTidy.h:101
 TMrbTidy.h:102
 TMrbTidy.h:103
 TMrbTidy.h:104
 TMrbTidy.h:105
 TMrbTidy.h:106
 TMrbTidy.h:107
 TMrbTidy.h:108
 TMrbTidy.h:109
 TMrbTidy.h:110
 TMrbTidy.h:111
 TMrbTidy.h:112
 TMrbTidy.h:113
 TMrbTidy.h:114
 TMrbTidy.h:115
 TMrbTidy.h:116
 TMrbTidy.h:117
 TMrbTidy.h:118
 TMrbTidy.h:119
 TMrbTidy.h:120
 TMrbTidy.h:121
 TMrbTidy.h:122
 TMrbTidy.h:123
 TMrbTidy.h:124
 TMrbTidy.h:125
 TMrbTidy.h:126
 TMrbTidy.h:127
 TMrbTidy.h:128
 TMrbTidy.h:129
 TMrbTidy.h:130
 TMrbTidy.h:131
 TMrbTidy.h:132
 TMrbTidy.h:133
 TMrbTidy.h:134
 TMrbTidy.h:135
 TMrbTidy.h:136
 TMrbTidy.h:137
 TMrbTidy.h:138
 TMrbTidy.h:139
 TMrbTidy.h:140
 TMrbTidy.h:141
 TMrbTidy.h:142
 TMrbTidy.h:143
 TMrbTidy.h:144
 TMrbTidy.h:145
 TMrbTidy.h:146
 TMrbTidy.h:147
 TMrbTidy.h:148
 TMrbTidy.h:149
 TMrbTidy.h:150
 TMrbTidy.h:151
 TMrbTidy.h:152
 TMrbTidy.h:153
 TMrbTidy.h:154
 TMrbTidy.h:155
 TMrbTidy.h:156
 TMrbTidy.h:157
 TMrbTidy.h:158
 TMrbTidy.h:159
 TMrbTidy.h:160
 TMrbTidy.h:161
 TMrbTidy.h:162
 TMrbTidy.h:163
 TMrbTidy.h:164
 TMrbTidy.h:165
 TMrbTidy.h:166
 TMrbTidy.h:167
 TMrbTidy.h:168
 TMrbTidy.h:169
 TMrbTidy.h:170
 TMrbTidy.h:171
 TMrbTidy.h:172
 TMrbTidy.h:173
 TMrbTidy.h:174
 TMrbTidy.h:175
 TMrbTidy.h:176
 TMrbTidy.h:177
 TMrbTidy.h:178
 TMrbTidy.h:179
 TMrbTidy.h:180
 TMrbTidy.h:181
 TMrbTidy.h:182
 TMrbTidy.h:183
 TMrbTidy.h:184
 TMrbTidy.h:185
 TMrbTidy.h:186
 TMrbTidy.h:187
 TMrbTidy.h:188
 TMrbTidy.h:189
 TMrbTidy.h:190
 TMrbTidy.h:191
 TMrbTidy.h:192
 TMrbTidy.h:193
 TMrbTidy.h:194
 TMrbTidy.h:195
 TMrbTidy.h:196
 TMrbTidy.h:197
 TMrbTidy.h:198
 TMrbTidy.h:199
 TMrbTidy.h:200
 TMrbTidy.h:201
 TMrbTidy.h:202
 TMrbTidy.h:203
 TMrbTidy.h:204
 TMrbTidy.h:205
 TMrbTidy.h:206
 TMrbTidy.h:207
 TMrbTidy.h:208
 TMrbTidy.h:209
 TMrbTidy.h:210
 TMrbTidy.h:211
 TMrbTidy.h:212
 TMrbTidy.h:213
 TMrbTidy.h:214
 TMrbTidy.h:215
 TMrbTidy.h:216
 TMrbTidy.h:217
 TMrbTidy.h:218
 TMrbTidy.h:219
 TMrbTidy.h:220
 TMrbTidy.h:221
 TMrbTidy.h:222
 TMrbTidy.h:223
 TMrbTidy.h:224
 TMrbTidy.h:225
 TMrbTidy.h:226
 TMrbTidy.h:227
 TMrbTidy.h:228
 TMrbTidy.h:229
 TMrbTidy.h:230
 TMrbTidy.h:231
 TMrbTidy.h:232
 TMrbTidy.h:233
 TMrbTidy.h:234
 TMrbTidy.h:235
 TMrbTidy.h:236
 TMrbTidy.h:237
 TMrbTidy.h:238
 TMrbTidy.h:239
 TMrbTidy.h:240
 TMrbTidy.h:241
 TMrbTidy.h:242
 TMrbTidy.h:243
 TMrbTidy.h:244
 TMrbTidy.h:245
 TMrbTidy.h:246
 TMrbTidy.h:247
 TMrbTidy.h:248
 TMrbTidy.h:249
 TMrbTidy.h:250
 TMrbTidy.h:251
 TMrbTidy.h:252
 TMrbTidy.h:253
 TMrbTidy.h:254
 TMrbTidy.h:255
 TMrbTidy.h:256
 TMrbTidy.h:257
 TMrbTidy.h:258
 TMrbTidy.h:259
 TMrbTidy.h:260
 TMrbTidy.h:261
 TMrbTidy.h:262
 TMrbTidy.h:263
 TMrbTidy.h:264
 TMrbTidy.h:265
 TMrbTidy.h:266
 TMrbTidy.h:267
 TMrbTidy.h:268
 TMrbTidy.h:269
 TMrbTidy.h:270
 TMrbTidy.h:271
 TMrbTidy.h:272
 TMrbTidy.h:273
 TMrbTidy.h:274
 TMrbTidy.h:275
 TMrbTidy.h:276
 TMrbTidy.h:277
 TMrbTidy.h:278
 TMrbTidy.h:279
 TMrbTidy.h:280
 TMrbTidy.h:281
 TMrbTidy.h:282
 TMrbTidy.h:283
 TMrbTidy.h:284
 TMrbTidy.h:285
 TMrbTidy.h:286
 TMrbTidy.h:287
 TMrbTidy.h:288
 TMrbTidy.h:289
 TMrbTidy.h:290
 TMrbTidy.h:291
 TMrbTidy.h:292
 TMrbTidy.h:293
 TMrbTidy.h:294
 TMrbTidy.h:295
 TMrbTidy.h:296
 TMrbTidy.h:297
 TMrbTidy.h:298
 TMrbTidy.h:299
 TMrbTidy.h:300
 TMrbTidy.h:301
 TMrbTidy.h:302
 TMrbTidy.h:303
 TMrbTidy.h:304
 TMrbTidy.h:305
 TMrbTidy.h:306
 TMrbTidy.h:307
 TMrbTidy.h:308
 TMrbTidy.h:309
 TMrbTidy.h:310
 TMrbTidy.h:311
 TMrbTidy.h:312
 TMrbTidy.h:313
 TMrbTidy.h:314
 TMrbTidy.h:315
 TMrbTidy.h:316
 TMrbTidy.h:317
 TMrbTidy.h:318
 TMrbTidy.h:319
 TMrbTidy.h:320
 TMrbTidy.h:321
 TMrbTidy.h:322
 TMrbTidy.h:323
 TMrbTidy.h:324
 TMrbTidy.h:325
 TMrbTidy.h:326
 TMrbTidy.h:327
 TMrbTidy.h:328
 TMrbTidy.h:329
 TMrbTidy.h:330
 TMrbTidy.h:331
 TMrbTidy.h:332
 TMrbTidy.h:333
 TMrbTidy.h:334
 TMrbTidy.h:335
 TMrbTidy.h:336
 TMrbTidy.h:337
 TMrbTidy.h:338
 TMrbTidy.h:339
 TMrbTidy.h:340
 TMrbTidy.h:341
 TMrbTidy.h:342
 TMrbTidy.h:343
 TMrbTidy.h:344
 TMrbTidy.h:345
 TMrbTidy.h:346
 TMrbTidy.h:347
 TMrbTidy.h:348
 TMrbTidy.h:349
 TMrbTidy.h:350
 TMrbTidy.h:351
 TMrbTidy.h:352
 TMrbTidy.h:353
 TMrbTidy.h:354
 TMrbTidy.h:355
 TMrbTidy.h:356
 TMrbTidy.h:357
 TMrbTidy.h:358
 TMrbTidy.h:359
 TMrbTidy.h:360
 TMrbTidy.h:361
 TMrbTidy.h:362
 TMrbTidy.h:363
 TMrbTidy.h:364
 TMrbTidy.h:365
 TMrbTidy.h:366
 TMrbTidy.h:367
 TMrbTidy.h:368
 TMrbTidy.h:369
 TMrbTidy.h:370
 TMrbTidy.h:371
 TMrbTidy.h:372
 TMrbTidy.h:373
 TMrbTidy.h:374
 TMrbTidy.h:375
 TMrbTidy.h:376
 TMrbTidy.h:377
 TMrbTidy.h:378
 TMrbTidy.h:379
 TMrbTidy.h:380
 TMrbTidy.h:381
 TMrbTidy.h:382
 TMrbTidy.h:383
 TMrbTidy.h:384
 TMrbTidy.h:385
 TMrbTidy.h:386
 TMrbTidy.h:387
 TMrbTidy.h:388
 TMrbTidy.h:389
 TMrbTidy.h:390
 TMrbTidy.h:391
 TMrbTidy.h:392
 TMrbTidy.h:393
 TMrbTidy.h:394
 TMrbTidy.h:395
 TMrbTidy.h:396
 TMrbTidy.h:397
 TMrbTidy.h:398
 TMrbTidy.h:399
 TMrbTidy.h:400
 TMrbTidy.h:401
 TMrbTidy.h:402
 TMrbTidy.h:403
 TMrbTidy.h:404
 TMrbTidy.h:405
 TMrbTidy.h:406
 TMrbTidy.h:407
 TMrbTidy.h:408
 TMrbTidy.h:409
 TMrbTidy.h:410
 TMrbTidy.h:411
 TMrbTidy.h:412
 TMrbTidy.h:413
 TMrbTidy.h:414
 TMrbTidy.h:415
 TMrbTidy.h:416
 TMrbTidy.h:417
 TMrbTidy.h:418
 TMrbTidy.h:419
 TMrbTidy.h:420
 TMrbTidy.h:421
 TMrbTidy.h:422
 TMrbTidy.h:423
 TMrbTidy.h:424
 TMrbTidy.h:425
 TMrbTidy.h:426
 TMrbTidy.h:427
 TMrbTidy.h:428
 TMrbTidy.h:429
 TMrbTidy.h:430
 TMrbTidy.h:431
 TMrbTidy.h:432
 TMrbTidy.h:433
 TMrbTidy.h:434
 TMrbTidy.h:435
 TMrbTidy.h:436
 TMrbTidy.h:437
 TMrbTidy.h:438
 TMrbTidy.h:439
 TMrbTidy.h:440
 TMrbTidy.h:441
 TMrbTidy.h:442
 TMrbTidy.h:443
 TMrbTidy.h:444
 TMrbTidy.h:445
 TMrbTidy.h:446
 TMrbTidy.h:447
 TMrbTidy.h:448
 TMrbTidy.h:449
 TMrbTidy.h:450
 TMrbTidy.h:451
 TMrbTidy.h:452
 TMrbTidy.h:453
 TMrbTidy.h:454
 TMrbTidy.h:455
 TMrbTidy.h:456
 TMrbTidy.h:457
 TMrbTidy.h:458
 TMrbTidy.h:459
 TMrbTidy.h:460
 TMrbTidy.h:461
 TMrbTidy.h:462
 TMrbTidy.h:463
 TMrbTidy.h:464
 TMrbTidy.h:465
 TMrbTidy.h:466
 TMrbTidy.h:467
 TMrbTidy.h:468
 TMrbTidy.h:469
 TMrbTidy.h:470
 TMrbTidy.h:471
 TMrbTidy.h:472
 TMrbTidy.h:473
 TMrbTidy.h:474
 TMrbTidy.h:475
 TMrbTidy.h:476
 TMrbTidy.h:477
 TMrbTidy.h:478
 TMrbTidy.h:479
 TMrbTidy.h:480
 TMrbTidy.h:481
 TMrbTidy.h:482
 TMrbTidy.h:483
 TMrbTidy.h:484
 TMrbTidy.h:485
 TMrbTidy.h:486
 TMrbTidy.h:487
 TMrbTidy.h:488
 TMrbTidy.h:489
 TMrbTidy.h:490
 TMrbTidy.h:491
 TMrbTidy.h:492
 TMrbTidy.h:493
 TMrbTidy.h:494
 TMrbTidy.h:495
 TMrbTidy.h:496
 TMrbTidy.h:497
 TMrbTidy.h:498
 TMrbTidy.h:499
 TMrbTidy.h:500
 TMrbTidy.h:501
 TMrbTidy.h:502
 TMrbTidy.h:503
 TMrbTidy.h:504
 TMrbTidy.h:505
 TMrbTidy.h:506
 TMrbTidy.h:507
 TMrbTidy.h:508
 TMrbTidy.h:509
 TMrbTidy.h:510
 TMrbTidy.h:511
 TMrbTidy.h:512
 TMrbTidy.h:513
 TMrbTidy.h:514
 TMrbTidy.h:515
 TMrbTidy.h:516
 TMrbTidy.h:517
 TMrbTidy.h:518
 TMrbTidy.h:519
 TMrbTidy.h:520
 TMrbTidy.h:521
 TMrbTidy.h:522
 TMrbTidy.h:523
 TMrbTidy.h:524
 TMrbTidy.h:525
 TMrbTidy.h:526
 TMrbTidy.h:527
 TMrbTidy.h:528
 TMrbTidy.h:529
 TMrbTidy.h:530
 TMrbTidy.h:531
 TMrbTidy.h:532
 TMrbTidy.h:533
 TMrbTidy.h:534
 TMrbTidy.h:535
 TMrbTidy.h:536
 TMrbTidy.h:537
 TMrbTidy.h:538
 TMrbTidy.h:539
 TMrbTidy.h:540
 TMrbTidy.h:541
 TMrbTidy.h:542
 TMrbTidy.h:543
 TMrbTidy.h:544
 TMrbTidy.h:545
 TMrbTidy.h:546
 TMrbTidy.h:547
 TMrbTidy.h:548
 TMrbTidy.h:549
 TMrbTidy.h:550
 TMrbTidy.h:551
 TMrbTidy.h:552
 TMrbTidy.h:553
 TMrbTidy.h:554
 TMrbTidy.h:555
 TMrbTidy.h:556
 TMrbTidy.h:557
 TMrbTidy.h:558
 TMrbTidy.h:559
 TMrbTidy.h:560
 TMrbTidy.h:561
 TMrbTidy.h:562
 TMrbTidy.h:563
 TMrbTidy.h:564
 TMrbTidy.h:565
 TMrbTidy.h:566
 TMrbTidy.h:567
 TMrbTidy.h:568
 TMrbTidy.h:569
 TMrbTidy.h:570
 TMrbTidy.h:571
 TMrbTidy.h:572
 TMrbTidy.h:573