From 53914f770f1e1dc1ab4342c64846fd995825b7e6 Mon Sep 17 00:00:00 2001 From: Stef Date: Wed, 17 Sep 2003 18:34:42 +0000 Subject: Initial Import --- src/xmlcomposer.h | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 src/xmlcomposer.h (limited to 'src/xmlcomposer.h') diff --git a/src/xmlcomposer.h b/src/xmlcomposer.h new file mode 100644 index 0000000..9463318 --- /dev/null +++ b/src/xmlcomposer.h @@ -0,0 +1,228 @@ +// RtfParser.h: interface for the RtfParser class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_RTFANALYSER_H__0243FE38_142A_4BDD_BA2C_1D122965444B__INCLUDED_) +#define AFX_RTFANALYSER_H__0243FE38_142A_4BDD_BA2C_1D122965444B__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "LevelHandler.h" + +struct RtfParserOptions +{ + RtfParserOptions() + { memset(this, 0, sizeof(*this)); } + + bool doColors; +}; + +class RtfParser : public LevelHandler +{ +public: + RtfParser(const RtfParserOptions& options); + virtual ~RtfParser(); + + virtual void startDocument(RtfReader* reader); + virtual void endDocument(); + virtual void controlWord(const string& cw, int flags, int param); + virtual void groupStart(); + virtual void groupEnd(); + virtual void charData(wstring data); + + + // Element management functions + DOM::Element createElement(const string& name); + void pushElement(const DOM::Element& element); + void replaceElement(const DOM::Element& element); + DOM::Element popElement(); + void setAttribute(const string& name, const wstring& value, DOM::Element el = DOM::Element()); + + // Changing the current parser functions + void setAnalyser(AnalyserPtr analy); + void setDestination(DestinationPtr dest); + DestinationPtr replaceDestination(DestinationPtr dest); + + // Current status functions + RtfFormatting& getTextFormatting(); + AnalyserPtr getAnalyser(); + DestinationPtr getDestination(); + DOM::Document getDocument() + { return m_document; } + + static bool isElement(const DOM::Node& node, const string& name); + static bool isEqualElement(const DOM::Element& el1, const DOM::Element& el2); + static void copyAttributes(const DOM::Element& src, DOM::Element& dest, const char** hideList); + static void insertAfter(DOM::Node& parent, const DOM::Node& node, const DOM::Node& ref); + static DOM::Element getContainingElement(const DOM::Node& node, const string& name); + static DOM::Element getPriorElement(const DOM::Node& node, const string& name); + + static wstring formatInt(int num); + + const RtfParserOptions& getOptions() + { return m_options; } + +protected: + // Cleanup Functions + void fixBlocks(DOM::Document doc); + void fixLists(const DOM::Document doc); + void fixStyles(const DOM::Document doc); + bool breakElement(DOM::Element& el, const string& contain); + + void breakBreak(DOM::Document& doc, const string& contain, + const string& tag); + void breakLists(DOM::Document& document); + void breakTables(DOM::Document& document); + void breakTags(DOM::Document& doc, const string& parentName, + const string& tagName); + void breakBlocks(DOM::Document& document); + void wrapTags(DOM::Document& document, const string& tagName, + const string& wrapName); + + void removeTags(const DOM::Document& doc); + void removeDuplicates(const DOM::Document& doc); + + virtual void clear(); + + +// Data +protected: + DOM::DOMImplementation m_impl; + DOM::Document m_document; + RtfParserOptions m_options; + + +// Sub classes +protected: + #define DESTINATION(cls) class cls : public Destination { public: + #define END_DESTINATION }; + #define ANALYSER(cls) class cls : public ParseAnalyser { public: + #define END_ANALYSER }; + #define DATA_PORTION protected: + #define INITIALIZE virtual void initialize(); + #define CHARDATA virtual void charData(wstring data); + #define CONTROLWORD virtual void controlWord(const string& cw, int flags, int param); + #define GROUPSTART virtual void groupStart(); + #define GROUPEND virtual void groupEnd(); + #define DONE virtual void done(); + + DESTINATION(Content) + INITIALIZE + CHARDATA + DATA_PORTION + bool created; + DOM::Element parent; + END_DESTINATION + + + DESTINATION(Null) + END_DESTINATION + + DESTINATION(Raw) + CHARDATA + END_DESTINATION + + DESTINATION(Attribute) + Attribute(const string& nm) : name(nm) {} + INITIALIZE + CHARDATA + DATA_PORTION + string name; + DOM::Element element; + END_DESTINATION + + class ParseAnalyser : + public Analyser + { + public: + virtual void controlWord(const string& cw, int flags, int param) + { processDefault(cw, flags, param); } + + protected: + // Some helper functions + bool processDefault(const string& cw, int flags, int param); + bool processTextFormatting(const string& cw, int flags, int param, RtfFormatting& format); + bool processTextContent(const string& cw, int flags, int param); + bool processTextFormatting(const string& cw, int flags, int param); + + DOM::Element getCurrentBlock(); + void applyParaFormatting(RtfFormatting* format, DOM::Element& el); + }; + + + ANALYSER(Skip) + INITIALIZE + GROUPSTART + END_ANALYSER + +#if 0 + ANALYSER(Table) + INITIALIZE + CONTROLWORD + DATA_PORTION + int stack; + LevelPtr level; + END_ANALYSER +#endif + + ANALYSER(Upr) + Upr(AnalyserPtr prv); + GROUPSTART + GROUPEND + DATA_PORTION + AnalyserPtr prev; + END_ANALYSER + + ANALYSER(Stylesheet) + INITIALIZE + GROUPSTART + END_ANALYSER + + ANALYSER(Style) + INITIALIZE + CONTROLWORD + GROUPSTART + GROUPEND + DATA_PORTION + bool haveStyle; + END_ANALYSER + + ANALYSER(ListTable) + INITIALIZE + GROUPSTART + END_ANALYSER + + ANALYSER(List) + INITIALIZE + CONTROLWORD + GROUPSTART + DATA_PORTION + int levelsSeen; + END_ANALYSER + + ANALYSER(ListOverrideTable) + INITIALIZE + CONTROLWORD + GROUPSTART + GROUPEND + DATA_PORTION + DOM::NodeList lists; + int lsId; + DOM::Element curList; + END_ANALYSER + + ANALYSER(Info) + INITIALIZE + CONTROLWORD + END_ANALYSER + + ANALYSER(Root) + INITIALIZE + CONTROLWORD + END_ANALYSER + +}; + +#endif // !defined(AFX_RTFANALYSER_H__0243FE38_142A_4BDD_BA2C_1D122965444B__INCLUDED_) -- cgit v1.2.3